<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 5.4.2">

  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" integrity="sha256-HtsXJanqjKTc8vVQjO4YMhiqFoXkfBsjBWcX91T1jr8=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">

<script class="next-config" data-name="main" type="application/json">{"hostname":"xiaoqingming18.github.io","root":"/","images":"/images","scheme":"Muse","darkmode":false,"version":"8.15.1","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":false,"style":null},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":false,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果：${query}","hits_time":"找到 ${hits} 个搜索结果（用时 ${time} 毫秒）","hits":"找到 ${hits} 个搜索结果"}}</script><script src="/js/config.js"></script>

    <meta name="description" content="记录我的学习、生活和恋爱日常">
<meta property="og:type" content="website">
<meta property="og:title" content="鸣蜩十七">
<meta property="og:url" content="http://xiaoqingming18.github.io/page/3/index.html">
<meta property="og:site_name" content="鸣蜩十七">
<meta property="og:description" content="记录我的学习、生活和恋爱日常">
<meta property="og:locale" content="zh_CN">
<meta property="article:author" content="鸣蜩十七">
<meta name="twitter:card" content="summary">


<link rel="canonical" href="http://xiaoqingming18.github.io/page/3/">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":true,"isPost":false,"lang":"zh-CN","comments":"","permalink":"","path":"page/3/index.html","title":""}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>鸣蜩十七</title>
  








  <noscript>
    <link rel="stylesheet" href="/css/noscript.css">
  </noscript>

<style>.github-emoji { position: relative; display: inline-block; width: 1.2em; min-height: 1.2em; overflow: hidden; vertical-align: top; color: transparent; }  .github-emoji > span { position: relative; z-index: 10; }  .github-emoji img, .github-emoji .fancybox { margin: 0 !important; padding: 0 !important; border: none !important; outline: none !important; text-decoration: none !important; user-select: none !important; cursor: auto !important; }  .github-emoji img { height: 1.2em !important; width: 1.2em !important; position: absolute !important; left: 50% !important; top: 50% !important; transform: translate(-50%, -50%) !important; user-select: none !important; cursor: auto !important; } .github-emoji-fallback { color: inherit; } .github-emoji-fallback img { opacity: 0 !important; }</style>
</head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <div class="column">
      <header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏" role="button">
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <i class="logo-line"></i>
      <h1 class="site-title">鸣蜩十七</h1>
      <i class="logo-line"></i>
    </a>
      <p class="site-subtitle" itemprop="description">鸣蜩十七是和女朋友谈恋爱的日子</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger" aria-label="搜索" role="button">
    </div>
  </div>
</div>



<nav class="site-nav">
  <ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签</a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类</a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档</a></li><li class="menu-item menu-item-schedule"><a href="/schedule/" rel="section"><i class="fa fa-calendar fa-fw"></i>日程表</a></li><li class="menu-item menu-item-sitemap"><a href="/sitemap.xml" rel="section"><i class="fa fa-sitemap fa-fw"></i>站点地图</a></li><li class="menu-item menu-item-commonweal"><a href="/404/" rel="section"><i class="fa fa-heartbeat fa-fw"></i>公益 404</a></li>
  </ul>
</nav>




</header>
        
  
  <aside class="sidebar">

    <div class="sidebar-inner sidebar-overview-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">鸣蜩十七</p>
  <div class="site-description" itemprop="description">记录我的学习、生活和恋爱日常</div>
</div>
<div class="site-state-wrap animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
        <a href="/archives/">
          <span class="site-state-item-count">43</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
          <a href="/categories/">
        <span class="site-state-item-count">8</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
          <a href="/tags/">
        <span class="site-state-item-count">37</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>

        </div>
      </div>
    </div>

    
  </aside>


    </div>

    <div class="main-inner index posts-expand">

    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/09/%E5%88%B7%E9%A2%98%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%89%9B%E5%AE%A2%E7%BD%91Java%E4%B8%93%E9%A1%B9%E7%BB%83%E4%B9%A0/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/09/%E5%88%B7%E9%A2%98%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%89%9B%E5%AE%A2%E7%BD%91Java%E4%B8%93%E9%A1%B9%E7%BB%83%E4%B9%A0/" class="post-title-link" itemprop="url">刷题笔记：牛客网Java专项练习</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>
      

      <time title="创建时间：2023-05-09 21:21:48 / 修改时间：21:35:46" itemprop="dateCreated datePublished" datetime="2023-05-09T21:21:48+08:00">2023-05-09</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%88%B7%E9%A2%98%E7%AC%94%E8%AE%B0/" itemprop="url" rel="index"><span itemprop="name">-刷题笔记</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="2023-5-9刷题笔记"><a href="#2023-5-9刷题笔记" class="headerlink" title="2023-5-9刷题笔记"></a>2023-5-9刷题笔记</h1><p>1.指出下列程序运行结果：</p>
<p><img src="/2023/05/09/%E5%88%B7%E9%A2%98%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%89%9B%E5%AE%A2%E7%BD%91Java%E4%B8%93%E9%A1%B9%E7%BB%83%E4%B9%A0/23-5-9-1.png" alt="第一题"></p>
<p>实参和形参的问题。<code>ex.change(ex.str,ex.ch)</code>语句调用<code>change</code>方法时，将<code>ex.str</code>变量（实参）的值赋给了”change”方法中的<code>str</code>变量（形参），而将<code>ex.ch</code>（实参）的地址赋给了<code>change</code>方法中的<code>ch</code>（形参）。<code>change</code>方法运行时，第一条语句改变的是方法中形参的值，对实参没影响，第二条语句由于是直接改变的<code>ch</code>所指地址的值，所以把实参也进行了改变。</p>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/09/Java%EF%BC%9A%E9%9B%86%E5%90%88/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/09/Java%EF%BC%9A%E9%9B%86%E5%90%88/" class="post-title-link" itemprop="url">Java：集合</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-09 20:50:44" itemprop="dateCreated datePublished" datetime="2023-05-09T20:50:44+08:00">2023-05-09</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-05-12 00:09:22" itemprop="dateModified" datetime="2023-05-12T00:09:22+08:00">2023-05-12</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%90%8E%E7%AB%AF/" itemprop="url" rel="index"><span itemprop="name">-后端</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="理解集合"><a href="#理解集合" class="headerlink" title="理解集合"></a>理解集合</h1><h2 id="什么是集合"><a href="#什么是集合" class="headerlink" title="什么是集合"></a>什么是集合</h2><p>Java的集合是一种用于存储和操作一组对象的数据结构，它提供了一些常用的方法来对这些对象进行操作。</p>
<h2 id="集合的框架体系"><a href="#集合的框架体系" class="headerlink" title="集合的框架体系"></a>集合的框架体系</h2><p>Java的集合分为三种类型：<code>List</code>、<code>Set</code>和<code>Map</code>。</p>
<p>下面我们来看一下Java集合框架继承关系图：</p>
<h1 id="List接口"><a href="#List接口" class="headerlink" title="List接口"></a>List接口</h1><h2 id="List接口及其主要方法介绍"><a href="#List接口及其主要方法介绍" class="headerlink" title="List接口及其主要方法介绍"></a>List接口及其主要方法介绍</h2><p><code>List</code>接口提供了一种动态数组的形式来存储和操作一组有序的元素。<code>List</code>接口定义了一系列的方法，可以对列表进行增删改查等操作：</p>
<ol>
<li><code>add(Object obj)</code>:向List中添加元素，返回该元素在List中的索引。</li>
<li><code>addAll(Collection&lt;? extends E&gt; c)</code>:向List中添加所有指定集合中的元素，返回该操作执行后List的大小。</li>
<li><code>clear()</code>:清空List中的所有元素。</li>
<li><code>contains(Object obj)</code>:判断List中是否包含指定元素，返回true或false。</li>
<li><code>indexOf(Object obj)</code>:获取指定元素在List中的索引，如果不存在则返回-1。</li>
<li><code>isEmpty()</code>:判断List是否为空。</li>
<li><code>iterator()</code>:返回一个迭代器，用于遍历List中的元素。</li>
<li><code>lastIndexOf(Object obj)</code>:获取指定元素在List中的最后一个索引，如果不存在则返回-1。</li>
<li><code>remove(Object obj)</code>:从List中移除指定元素，返回该元素在List中的索引。</li>
<li><code>size()</code>:获取List的大小。</li>
<li><code>sort()</code>:对List进行排序，默认按升序排列。</li>
<li><code>toString()</code>:将List转换为字符串表示形式。</li>
<li><code>subList(int fromIndex, int toIndex)</code>:获取从指定索引开始到指定索引结束的子列表。</li>
</ol>
<p>除了上面提到的几种方法，下面还有一些重写过的同名方法：</p>
<ol>
<li><code>addAll(int index, Collection&lt;? extends E&gt; c)</code>:向指定索引位置开始、最多填充<code>maxFill</code>个元素的List中添加所有指定集合中的元素，返回该操作执行后List的大小。</li>
<li><code>addAll(int index, Collection&lt;? extends E&gt; c, int maxFill)</code>:向指定索引位置开始、最多填充<code>maxFill</code>个元素的List中添加所有指定集合中的元素，返回该操作执行后List的大小。</li>
</ol>
<h2 id="List接口继承关系"><a href="#List接口继承关系" class="headerlink" title="List接口继承关系"></a>List接口继承关系</h2><p>下面通过一张图看看<code>List</code>接口的继承关系：</p>
<p><img src="/2023/05/09/Java%EF%BC%9A%E9%9B%86%E5%90%88/List继承关系.png" alt="List继承关系"></p>
<p>从图中可以看到<code>List</code>接口下有四个较为常见的实现类，下面我们分别详细介绍。</p>
<h2 id="ArrayList类"><a href="#ArrayList类" class="headerlink" title="ArrayList类"></a>ArrayList类</h2><p><code>ArrayList</code>是Java集合框架中<code>List</code>接口的一个实现类。它是一个基于数组实现的动态数组，可以<strong>动态地添加、删除和修改元素</strong>。</p>
<p><code>ArrayList</code>的特点：</p>
<ol>
<li>自动扩容：<code>ArrayList</code>的底层实现是一个动态数组，因此它的容量可以根据需要自动调整。</li>
<li>随机访问：由于<code>ArrayList</code>是基于数组实现的，所以它支持快速的随机访问，可以使用<code>get()</code>方法通过索引获取元素。</li>
<li>查询快：<code>ArrayList</code>可以通过<code>get(int index)</code>方法通过索引快速获取指定位置的元素。</li>
<li>增删慢：每次删除元素，都需要更改数组长度、拷贝以及移动元素位置。</li>
<li>非线程安全：<code>ArrayList</code>是非线程安全的，因此在多线程环境下，需要使用线程安全的集合类或者手动进行同步。</li>
</ol>
<p>另一个要注意的点是<code>ArrayList</code>可以存放<code>null</code>并且可以存放多个<code>null</code>。</p>
<p>创建<code>ArrayList</code>实例的方法有两种，分别是<code>ArrayList list = new ArrayList&lt;&gt;()</code>和<code>List list = new ArrayList&lt;&gt;()</code>。常建议使用<code>List list = new ArrayList&lt;&gt;()</code>的方式创建<code>ArrayList</code>，原因如下：</p>
<ol>
<li>更加灵活：使用<code>List接口</code>作为类型，可以轻松地将<code>ArrayList</code>替换为其他实现了<code>List</code>接口的类。如果我们在代码中使用具体的<code>ArrayList</code>类型，那么在需要更换为其他实现<code>List</code>接口的类时，就需要修改大量的代码。</li>
<li>可扩展性更好：由于<code>List</code>是一个接口，因此它可以被其他类实现，并且可以将这些实现与<code>ArrayList</code>进行比较。这使得我们可以根据实际的需求选择最适合的List实现，从而提高代码的可扩展性和可维护性。</li>
<li>面向接口编程的优点：面向接口编程是一种良好的编程实践，它可以使代码更加灵活、可扩展和易于维护。使用<code>List</code>接口作为类型，可以让我们更好地实现面向接口编程的思想，从而编写更加高质量的代码。</li>
</ol>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/09/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/09/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8/" class="post-title-link" itemprop="url">数据库原理：触发器</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-09 10:39:36" itemprop="dateCreated datePublished" datetime="2023-05-09T10:39:36+08:00">2023-05-09</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-06-23 21:38:01" itemprop="dateModified" datetime="2023-06-23T21:38:01+08:00">2023-06-23</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/" itemprop="url" rel="index"><span itemprop="name">-数据库原理</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="什么是触发器"><a href="#什么是触发器" class="headerlink" title="什么是触发器"></a>什么是触发器</h1><p><strong>触发器</strong>是一种特殊的数据库对象，它是一段预定义的代码，<strong>可以在数据库中的特定事件发生时自动执行</strong>。触发器通常与数据库中的表相关联，<strong>当表中的数据发生变化时，触发器可以自动执行一些预定义的操作</strong>，比如修改其他表中的数据，或者向其他应用程序发送通知等。</p>
<p>触发器可以在以下几种情况下被触发：</p>
<ol>
<li>在插入数据之前或之后触发。</li>
<li>在更新数据之前或之后触发。</li>
<li>在删除数据之前或之后触发。</li>
</ol>
<p>触发器可以用于实现以下功能：</p>
<ol>
<li>强制实施业务规则：通过在触发器中添加代码，可以确保在插入、更新或删除数据时符合特定的业务规则。</li>
<li>级联更新：当一个表中的数据被修改时，触发器可以自动更新其他表中的数据，从而确保数据库中的数据一致性。</li>
<li>记录修改历史：通过在触发器中添加代码，可以记录所有数据的修改历史，包括谁进行了修改，何时进行的修改以及修改的内容等。</li>
</ol>
<p>需要注意的是，触发器可能会对数据库的性能产生一定的影响，因此在设计和使用触发器时需要慎重考虑，并确保它们的执行效率和正确性。</p>
<p>某机器中，已知配有一个地址空间为000H~3FFFH的ROM区域。现在再用一个8Kx8的RAM芯片构成40K×16位的RAM区域，起始地址为6000H。假设RAM芯片有CS和WE信号控制端。CPU的地址线为A15-A0,数据线为D15-D0。用CPU地址的高三位通过3-8译码器作为片选信号，为什么需要译码器的两个输出来连接ROM呢？</p>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/08/Java%EF%BC%9A%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%92%8C%E5%8F%8D%E5%B0%84/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/08/Java%EF%BC%9A%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%92%8C%E5%8F%8D%E5%B0%84/" class="post-title-link" itemprop="url">Java：枚举类和反射</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-08 21:14:11" itemprop="dateCreated datePublished" datetime="2023-05-08T21:14:11+08:00">2023-05-08</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-06-27 19:02:39" itemprop="dateModified" datetime="2023-06-27T19:02:39+08:00">2023-06-27</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%90%8E%E7%AB%AF/" itemprop="url" rel="index"><span itemprop="name">-后端</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="枚举类"><a href="#枚举类" class="headerlink" title="枚举类"></a>枚举类</h1><h2 id="什么是枚举类？"><a href="#什么是枚举类？" class="headerlink" title="什么是枚举类？"></a>什么是枚举类？</h2><p>枚举类是一种特殊的类，用于表示一组预定义的常量。</p>
<p>枚举在曰常生活中很常见，例如一个人的性别只能是“男”或者“女”，一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时，就可以将它定义为枚举类型。</p>
<h2 id="声明枚举类"><a href="#声明枚举类" class="headerlink" title="声明枚举类"></a>声明枚举类</h2><p>声明枚举时必须使用 enum 关键字，然后定义枚举的名称、可访问性、基础类型和成员等。如下，声明一个性别枚举类：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> <span class="title class_">Gender</span> {</span><br><span class="line">    MALE,FEMALE;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>之后便可以通过枚举类型名直接引用常量，如 <code>Gender.MALE</code>或<code>Gender.FEMALE</code>。</p>
<h2 id="枚举类与switch语句"><a href="#枚举类与switch语句" class="headerlink" title="枚举类与switch语句"></a>枚举类与switch语句</h2><p>使用枚举还可以使 switch 语句的可读性更强，例如以下示例代码：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> <span class="title class_">Gender</span> {</span><br><span class="line">    MALE,FEMALE;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">EnumTest</span> {</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">        <span class="type">Gender</span> <span class="variable">gender</span> <span class="operator">=</span> Gender.MALE;</span><br><span class="line">        <span class="keyword">switch</span>(gender) {</span><br><span class="line">            <span class="keyword">case</span> MALE:</span><br><span class="line">                System.out.println(<span class="string">"男"</span>);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> FEMALE:</span><br><span class="line">                System.out.println(<span class="string">"女"</span>);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<h2 id="枚举类的成员变量、方法和构造器"><a href="#枚举类的成员变量、方法和构造器" class="headerlink" title="枚举类的成员变量、方法和构造器"></a>枚举类的成员变量、方法和构造器</h2><p>可以将一个枚举类型看作是一个类，它继承于<code>java.lang.Enum</code>类，<strong>当定义一个枚举类型时，每一个枚举类型成员都可以看作是枚举类型的一个实例，这些枚举类型成员默认都被final、public、static所修饰</strong>，所以当<strong>使用枚举类型成员时直接使用枚举类型名称调用</strong>枚举类型成员即可。</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> <span class="title class_">Gender</span> {</span><br><span class="line">    MALE,FEMALE;</span><br><span class="line">    <span class="comment">//定义一个public修饰的实例变量</span></span><br><span class="line">    <span class="keyword">public</span> String name;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GenderTest</span> {</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">        <span class="comment">//通过Enum的valueOf()方法来获取指定枚举类的枚举值</span></span><br><span class="line">        <span class="type">Gender</span> <span class="variable">g</span> <span class="operator">=</span> Enum.valueOf(Gender.class, <span class="string">"FEMALE"</span>);<span class="comment">//此时的g也就是枚举值，相当于new产生的对象</span></span><br><span class="line">        <span class="comment">//直接为枚举值的name实例变量赋值</span></span><br><span class="line">        g.name=<span class="string">"女"</span>;</span><br><span class="line">        <span class="comment">//直接访问枚举值的name实例变量</span></span><br><span class="line">        System.out.println(g+<span class="string">"代表"</span>+g.name);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>输出结果如下：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FEMALE代表女</span><br></pre></td></tr></tbody></table></figure>
<p>这里就要注意<code>Enum</code>类的<code>valueOf()</code>和一个具体枚举类的<code>valueOf()</code>方法的区别了：</p>
<h2 id="Enum类的valueOf-和具体枚举类的valueOf-方法的区别"><a href="#Enum类的valueOf-和具体枚举类的valueOf-方法的区别" class="headerlink" title="Enum类的valueOf()和具体枚举类的valueOf()方法的区别"></a>Enum类的valueOf()和具体枚举类的<code>valueOf()</code>方法的区别</h2><p><code>Enum</code> 类的 <code>valueOf</code> 方法是一个静态方法，用于根据指定的枚举常量名称返回对应的枚举常量的实例。它的具体语法如下：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Enum.valueOf(Class&lt;T&gt; enumType, String name)</span><br></pre></td></tr></tbody></table></figure>
<p>而一个具体的枚举类的 <code>valueOf</code> 方法是一个非静态方法，也用于返回该枚举常量的实例。它的具体语法如下：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">aEnum <span class="title function_">valueOf</span><span class="params">(String name)</span></span><br></pre></td></tr></tbody></table></figure>
<p>两个方法的<code>name</code>参数都是表示要获取的枚举常量的名称。</p>
<p>唯一的区别在于，<code>Enum</code> 类的 <code>valueOf</code> 方法多了一个<code>enumType</code>参数指定枚举类型的 <code>Class</code> 对象。</p>
<h2 id="枚举类方法"><a href="#枚举类方法" class="headerlink" title="枚举类方法"></a>枚举类方法</h2><p>Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时，<strong>每一个枚举类型成员都可以看作是 Enum 类的实例</strong>，这些枚举成员默认都被 final、public, static 修饰，<strong>当使用枚举类型成员时，直接使用枚举名称调用成员即可</strong>。</p>
<p>下面是<code>Enum</code>类的主要方法：</p>
<div class="table-container">
<table>
<thead>
<tr>
<th>方法名称</th>
<th>描述</th>
<th><strong>使用方法</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>values()</td>
<td>以数组形式返回枚举类型的所有成员</td>
<td>枚举类型名称.values()</td>
</tr>
<tr>
<td>valueOf()</td>
<td>将普通字符串转换为枚举实例</td>
<td>枚举类型名称.valueOf(“ABC”)</td>
</tr>
<tr>
<td>compareTo()</td>
<td>比较两个枚举成员在定义时的顺序</td>
<td>枚举对象.compareTo()</td>
</tr>
<tr>
<td>ordinal()</td>
<td>获取枚举成员的索引位置</td>
<td>枚举对象.ordinal()</td>
</tr>
</tbody>
</table>
</div>
<h3 id="values-方法"><a href="#values-方法" class="headerlink" title="values()方法"></a>values()方法</h3><p> <code>values()</code>方法可以将枚举的所有成员以数组形式返回，也可以通过该方法获取枚举类型的成员。</p>
<p>下面的示例创建一个包含 3 个成员的枚举类型 Signal，然后调用 values() 方法输出这些成员。</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> <span class="title class_">Signal</span> {</span><br><span class="line">    <span class="comment">// 定义一个枚举类型</span></span><br><span class="line">    GREEN,YELLOW,RED;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;i &lt; Signal.values().length;i++) {</span><br><span class="line">        System.out.println(<span class="string">"枚举成员："</span>+Signal.values()[i]);</span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"><span class="comment">// 结果如下：</span></span><br><span class="line"><span class="comment">// 枚举成员：GREEN</span></span><br><span class="line"><span class="comment">// 枚举成员：YELLOW</span></span><br><span class="line"><span class="comment">// 枚举成员：RED</span></span><br></pre></td></tr></tbody></table></figure>
<h3 id="valueOf-方法与compareTo-方法"><a href="#valueOf-方法与compareTo-方法" class="headerlink" title="valueOf()方法与compareTo()方法"></a>valueOf()方法与compareTo()方法</h3><p><code>valueOf()</code>方法将普通字符串转换为枚举实例（字符串要与枚举值一致这样才能获取到对应的枚举实例）。</p>
<p><code>compareTo()</code>方法用于比较两个枚举对象在定义时的顺序。</p>
<p>下面的例子展示了枚举中<code>valueOf()</code>与<code>compareTo()</code>方法的使用：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> <span class="title class_">Color</span> {</span><br><span class="line">    BLUE,GREEN,RED,WHITE,BLACK;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">EnumStudy_1</span> {</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">compare</span><span class="params">(Color aColor)</span> {</span><br><span class="line">        <span class="keyword">for</span>(Color i : Color.values()) {</span><br><span class="line">            System.out.println(aColor + <span class="string">"与"</span> + i + <span class="string">"的比较结果为："</span> + aColor.compareTo(i));</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">        <span class="type">Color</span> <span class="variable">green</span> <span class="operator">=</span> Color.valueOf(<span class="string">"GREEN"</span>);</span><br><span class="line">        compare(green);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>这个例子的输出结果如下：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">GREEN与BLUE的比较结果为：<span class="number">1</span></span><br><span class="line">GREEN与GREEN的比较结果为：<span class="number">0</span></span><br><span class="line">GREEN与RED的比较结果为：-<span class="number">1</span></span><br><span class="line">GREEN与WHITE的比较结果为：-<span class="number">2</span></span><br><span class="line">GREEN与BLACK的比较结果为：-<span class="number">3</span></span><br></pre></td></tr></tbody></table></figure>
<h3 id="ordinal-方法"><a href="#ordinal-方法" class="headerlink" title="ordinal()方法"></a>ordinal()方法</h3><p>该方法用于得到枚举成员的位置索引。</p>
<p>看下面的例子：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> <span class="title class_">Color</span> {</span><br><span class="line">    BLUE,GREEN,RED,WHITE,BLACK;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">EnumStudy_1</span> {</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line">        <span class="keyword">for</span>(Color i : Color.values()) {</span><br><span class="line">            System.out.println(i + <span class="string">"在枚举类的位置索引是："</span> + i.ordinal());</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>输出结果如下：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">BLUE在枚举类的位置索引是：<span class="number">0</span></span><br><span class="line">GREEN在枚举类的位置索引是：<span class="number">1</span></span><br><span class="line">RED在枚举类的位置索引是：<span class="number">2</span></span><br><span class="line">WHITE在枚举类的位置索引是：<span class="number">3</span></span><br><span class="line">BLACK在枚举类的位置索引是：<span class="number">4</span></span><br></pre></td></tr></tbody></table></figure>
<h2 id="枚举类与普通类区别"><a href="#枚举类与普通类区别" class="headerlink" title="枚举类与普通类区别"></a>枚举类与普通类区别</h2><ol>
<li>枚举类可以实现一个或多个接口，<strong>使用<code>enum</code>定义的枚举类默认继承<code>java.lang.Enum</code>类，而不是默认继承<code>Object</code>类，因此枚举类不能显示继承其他父类</strong>，其中 <code>java.lang.Enum</code>类实现了<code>java.lang.Serializable</code>和<code>java.lang.Comparable</code>两个接口。</li>
<li>使用<code>enum</code>定义、非抽象的枚举类默认会使用final修饰，因此<strong>枚举类不能派生子类</strong>。</li>
<li><strong>枚举类的构造器只能使用private访问控制符</strong>，如果省略了构造器的访问控制符，则默认使用private修饰；如果强制指定访问控制符，则只能指定private修饰符。</li>
<li><strong>枚举类的所有实例必须在枚举类的第一行显示列出，否则这个枚举类永远不能产生实例</strong>。列出这些实例时，系统会自动添加public static final修饰，无需我们显式添加。</li>
</ol>
<h1 id="反射"><a href="#反射" class="headerlink" title="反射"></a>反射</h1>
      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/" class="post-title-link" itemprop="url">计算机组成原理：运算方法和运算器</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-08 20:11:44" itemprop="dateCreated datePublished" datetime="2023-05-08T20:11:44+08:00">2023-05-08</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-06-14 17:23:58" itemprop="dateModified" datetime="2023-06-14T17:23:58+08:00">2023-06-14</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" itemprop="url" rel="index"><span itemprop="name">-计算机组成原理</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="进位计数制"><a href="#进位计数制" class="headerlink" title="进位计数制"></a>进位计数制</h1><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/进位计数制.png" alt="进位计数制"></p>
<h2 id="r进制计数法"><a href="#r进制计数法" class="headerlink" title="r进制计数法"></a>r进制计数法</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/r进制计数法.png" alt="r进制计数法"></p>
<h2 id="任意进制→十进制"><a href="#任意进制→十进制" class="headerlink" title="任意进制→十进制"></a>任意进制→十进制</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/任意进制转化十进制.png" alt="任意进制转化十进制"></p>
<h2 id="二进制→八进制和十六进制"><a href="#二进制→八进制和十六进制" class="headerlink" title="二进制→八进制和十六进制"></a>二进制→八进制和十六进制</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/二进制转化为八进制和十六进制.png" alt="二进制转化为八进制和十六进制"></p>
<h2 id="各种进制常见的书写方式"><a href="#各种进制常见的书写方式" class="headerlink" title="各种进制常见的书写方式"></a>各种进制常见的书写方式</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/各种进制常见的书写方式.png" alt="各种进制常见的书写方式"></p>
<h2 id="十进制→任意进制"><a href="#十进制→任意进制" class="headerlink" title="十进制→任意进制"></a>十进制→任意进制</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/十进制转化为任意进制1.png" alt="十进制转化为任意进制1"></p>
<p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/十进制转化为任意进制2.png" alt="十进制转化为任意进制2"></p>
<h2 id="真值和机器数"><a href="#真值和机器数" class="headerlink" title="真值和机器数"></a>真值和机器数</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/真值和机器数.png" alt="真值和机器数"></p>
<h2 id="本节知识回顾与总结"><a href="#本节知识回顾与总结" class="headerlink" title="本节知识回顾与总结"></a>本节知识回顾与总结</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/知识回顾1.png" alt="本节知识回顾与总结"></p>
<h1 id="BCD码"><a href="#BCD码" class="headerlink" title="BCD码"></a>BCD码</h1><p>BCD码是一种用二进制数码来表示十进制数的编码方式。它将一个十进制数的每个十进制位数码化为4位二进制数来表示，每个4位二进制数的取值范围是0000-1001，即十进制的0-9。因此，一个BCD码可以表示一个十进制数的每个十进制位。例如，数字123的BCD码为0001 0010 0011。</p>
<p>与其他二进制编码方式相比，BCD码具有以下特点：</p>
<ol>
<li>BCD码可以直接表示十进制数，无需进行进制转换，方便了数字的计算和表示。</li>
<li>BCD码中的每个4位二进制数只能取0~9的十进制数码，不存在其他不合法的数值，因此不会出现进位或借位的情况，可以避免类似于浮点数计算中的舍入误差。</li>
<li>BCD码的编码密度比较低，需要更多的位数来表示同样的数字，因此占用的存储空间和传输带宽相对较大。</li>
</ol>
<p>BCD码又分为余3码和2421码，下面我们来看它们的具体区别。</p>
<h2 id="8421码"><a href="#8421码" class="headerlink" title="8421码"></a>8421码</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/8421码.png" alt="8421码"></p>
<p>要注意的是，用8421码时，若相加得到的结果超过表示范围0-9（0000-1001），则需要对结果进行加6（0110）修正，并在高位补齐0。</p>
<h2 id="余3码"><a href="#余3码" class="headerlink" title="余3码"></a>余3码</h2><p>余3码的编码规则是将一个10进制数的每个十进制位数值加上3，然后再将结果转换为4位二进制数。例如，数字123的余3码为0011 0100 0101，其中，1+3=4，2+3=5，3+3=6，它们分别被转换为4位二进制数0100、0101和0110。</p>
<p>余3码的主要特点是编码密度高、进位比较容易，但是它的反码加3的规则比较复杂，不方便进行计算和处理。</p>
<h2 id="2421码"><a href="#2421码" class="headerlink" title="2421码"></a>2421码</h2><p>2421码的编码规则是将一个10进制数的每个十进制位数值分别用4位二进制数表示，其中，千位数的编码方式为8421，百位、十位和个位的编码方式为将其对应的8421码反转后减去3的结果。例如，数字123的2421码为1000 0011 0010 0001，其中，百位数的8421码为0010，反转后为0101，减去3后得到0010，十位和个位数的8421码为0011和0001，反转后分别为1100和1110，减去3后分别得到1011和1101。</p>
<p>2421码的主要特点是编码规则简单、容易计算和处理，但是它的编码密度相对较低，需要更多的位数来表示同样的数字。</p>
<h1 id="数据与文字的表示方法"><a href="#数据与文字的表示方法" class="headerlink" title="数据与文字的表示方法"></a>数据与文字的表示方法</h1><h2 id="无符号整数的表示和运算"><a href="#无符号整数的表示和运算" class="headerlink" title="无符号整数的表示和运算"></a>无符号整数的表示和运算</h2><h3 id="无符号整数在计算机内部的表示"><a href="#无符号整数在计算机内部的表示" class="headerlink" title="无符号整数在计算机内部的表示"></a>无符号整数在计算机内部的表示</h3><p>我们以及机器字长为8位的机器为例，它的通用寄存器只能存8位，最多只能同时进行8位计算：</p>
<p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/8位机器字长无符号整数表示.png" alt="8位机器字长无符号整数表示"></p>
<p>下面来看无符号整数在计算机内部表示的细节：</p>
<p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/无符号整数表示细节.png" alt="无符号整数表示细节"></p>
<h3 id="无符号整数的加法运算"><a href="#无符号整数的加法运算" class="headerlink" title="无符号整数的加法运算"></a>无符号整数的加法运算</h3><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/无符号整数加法运算.png" alt="无符号整数加法运算"></p>
<h3 id="无符号整数的减法运算"><a href="#无符号整数的减法运算" class="headerlink" title="无符号整数的减法运算"></a>无符号整数的减法运算</h3><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/无符号整数减法.png" alt="无符号整数减法运算"></p>
<p>下面来看看减数B是怎么变的：</p>
<p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/减数变换.png" alt="减数变换"></p>
<p>然后减法变加法：</p>
<p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/减法变加法.png" alt="减法变加法"></p>
<h2 id="带符号整数的运算和表示"><a href="#带符号整数的运算和表示" class="headerlink" title="带符号整数的运算和表示"></a>带符号整数的运算和表示</h2><h3 id="原码表示"><a href="#原码表示" class="headerlink" title="原码表示"></a>原码表示</h3><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/原码表示.png" alt="原码表示"></p>
<ol>
<li>注意以下内容：若机器字长$n+1$位，则带符号整数的表示范围为$-(2^n-1)≤x≤2^n-1$。</li>
<li>真值0有两种形式：$+0$和$-0$， $[+0]_原=0,0000000$， $[-0]_原=1,0000000$。</li>
</ol>
<h3 id="原码表示法缺点"><a href="#原码表示法缺点" class="headerlink" title="原码表示法缺点"></a>原码表示法缺点</h3><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/原码缺点.png" alt="原码缺点"></p>
<p>为了克服这一缺点，引入补码以及补码运算。</p>
<h3 id="原码转化为补码"><a href="#原码转化为补码" class="headerlink" title="原码转化为补码"></a>原码转化为补码</h3><p>正数的原码就是补码，负数要先把原码先变为反码，即所有数值位取反，最后末尾加一就变成补码了。（切记不要动符号位哦！）</p>
<h3 id="补码转化为原码"><a href="#补码转化为原码" class="headerlink" title="补码转化为原码"></a>补码转化为原码</h3><p>正数的补码就是原码，负数的补码转化为原码，先从补码的右边开始数，数到第一个1时，这个1左边的所有<strong>数值位</strong>取反。</p>
<h3 id="补码加法运算"><a href="#补码加法运算" class="headerlink" title="补码加法运算"></a>补码加法运算</h3><p>补码加法：从最低位开始，按位相加（符号位而已参与运算），并往更高位进位。最后超出机器字长的高位进位舍弃。</p>
<h3 id="补码减法运算"><a href="#补码减法运算" class="headerlink" title="补码减法运算"></a>补码减法运算</h3><p>补码减法运算法则：</p>
<script type="math/tex; mode=display">[A]_补-[B]_补=[A]_补+[-B]_补</script><p>$[B]_补求[-B]_补$的方法：从右往左找到第一个1，这个1左边所有位取反（包括符号位），右边保持不变，就得到了$[B]_补$。</p>
<h3 id="各种码的特性总结"><a href="#各种码的特性总结" class="headerlink" title="各种码的特性总结"></a>各种码的特性总结</h3><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/各种码的特性总结.png" alt="各种码的特性总结"></p>
<h3 id="本节总结"><a href="#本节总结" class="headerlink" title="本节总结"></a>本节总结</h3><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/有符号整数总结.png" alt="有符号整数总结"></p>
<h2 id="移码"><a href="#移码" class="headerlink" title="移码"></a>移码</h2><p>在补码的基础上<strong>符号位取反</strong>就得到移码。</p>
<h2 id="定点小数的表示和运算"><a href="#定点小数的表示和运算" class="headerlink" title="定点小数的表示和运算"></a>定点小数的表示和运算</h2><h3 id="定点小数的原码表示"><a href="#定点小数的原码表示" class="headerlink" title="定点小数的原码表示"></a>定点小数的原码表示</h3><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/定点小数的原码表示.png" alt="定点小数原码表示"></p>
<h3 id="定点小数的原-反-补码的转换"><a href="#定点小数的原-反-补码的转换" class="headerlink" title="定点小数的原/反/补码的转换"></a>定点小数的原/反/补码的转换</h3><p>与上面说的定点整数（有符号整数）的转换规则一样：</p>
<p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/各种码互换.png" alt="各种码互换"></p>
<h3 id="定点小数的加减运算"><a href="#定点小数的加减运算" class="headerlink" title="定点小数的加减运算"></a>定点小数的加减运算</h3><p>这里也与定点整数的加减运算一样：</p>
<p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/定点小数的加减运算.png" alt="定点小数的加减运算"></p>
<h1 id="算术逻辑单元ALU（电路基本原理-amp-加法器设计）"><a href="#算术逻辑单元ALU（电路基本原理-amp-加法器设计）" class="headerlink" title="算术逻辑单元ALU（电路基本原理&amp;加法器设计）"></a>算术逻辑单元ALU（电路基本原理&amp;加法器设计）</h1><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/ALU.png" alt="ALU"></p>
<p>如上图，左边的$M$告诉CPU执行算术运算还是逻辑运算，$S_1$~$S_0$则告诉CPU执行哪一种算数运算或逻辑运算。</p>
<p>下面提供两个操作数，每个操作数是4bit的，这就是机器字长的真面目。</p>
<h2 id="最基本的逻辑运算"><a href="#最基本的逻辑运算" class="headerlink" title="最基本的逻辑运算"></a>最基本的逻辑运算</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/基本逻辑运算.png" alt="基本逻辑运算"></p>
<h2 id="复合逻辑运算"><a href="#复合逻辑运算" class="headerlink" title="复合逻辑运算"></a>复合逻辑运算</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/符合逻辑.png" alt="复合逻辑"></p>
<h2 id="一位全加器"><a href="#一位全加器" class="headerlink" title="一位全加器"></a>一位全加器</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/一位全加器.png" alt="一位全加器"></p>
<h2 id="串行加法器"><a href="#串行加法器" class="headerlink" title="串行加法器"></a>串行加法器</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/串行加法器.png" alt="串行加法器"></p>
<h2 id="并行加法器"><a href="#并行加法器" class="headerlink" title="并行加法器"></a>并行加法器</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/并行加法器.png" alt="并行加法器"></p>
<h2 id="本节回顾"><a href="#本节回顾" class="headerlink" title="本节回顾"></a>本节回顾</h2><p><img src="/2023/05/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%BF%90%E7%AE%97%E6%96%B9%E6%B3%95%E5%92%8C%E8%BF%90%E7%AE%97%E5%99%A8/ALU回顾.png" alt="ALU回顾"></p>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/" class="post-title-link" itemprop="url">计算机组成原理：计算机系统概论</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-07 23:33:45" itemprop="dateCreated datePublished" datetime="2023-05-07T23:33:45+08:00">2023-05-07</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-05-08 20:18:14" itemprop="dateModified" datetime="2023-05-08T20:18:14+08:00">2023-05-08</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" itemprop="url" rel="index"><span itemprop="name">-计算机组成原理</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="计算机结构"><a href="#计算机结构" class="headerlink" title="计算机结构"></a>计算机结构</h1><h2 id="早期冯诺依曼机"><a href="#早期冯诺依曼机" class="headerlink" title="早期冯诺依曼机"></a>早期冯诺依曼机</h2><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/早期冯诺依曼机.png" alt="早期冯诺依曼机"></p>
<p>冯诺依曼计算机的特点：</p>
<ol>
<li>计算机由五大部件组成；</li>
<li>指令和数据以同等地位存储于存储器，可按地址寻访；</li>
<li>指令和数据用二进制数据表示；</li>
<li>指令由操作码和地址码组成；</li>
<li>存储程序</li>
<li>以运算器为中心（输入/输出设备与存储器之间的数据传送通过运算器完成）</li>
</ol>
<h2 id="现代计算机结构"><a href="#现代计算机结构" class="headerlink" title="现代计算机结构"></a>现代计算机结构</h2><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/现代计算机结构.png" alt="现代计算机结构"></p>
<p>由于运算器和控制器联系紧密，<strong>现代计算机通常将运算器与控制器集成在一块芯片上——CPU</strong>，所以，现代计算机的结构可以简化为下图所示：</p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/现代计算机结构2.png" alt="现代计算机结构"></p>
<h2 id="本节知识回顾与总结"><a href="#本节知识回顾与总结" class="headerlink" title="本节知识回顾与总结"></a>本节知识回顾与总结</h2><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/回顾1.png" alt="本节总结"></p>
<h1 id="主存储器的基本组成"><a href="#主存储器的基本组成" class="headerlink" title="主存储器的基本组成"></a>主存储器的基本组成</h1><h2 id="主存储器的结构"><a href="#主存储器的结构" class="headerlink" title="主存储器的结构"></a>主存储器的结构</h2><p>先来看看主存储器的构成结构：</p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/主存储器结构.png" alt="主存储器结构"></p>
<p><strong>主存储器由存储体、存储地址寄存器和存储数据寄存器三部分组成</strong>，它们分别负责存储数据、存储地址和存储数据的读写操作，下面是它们的工作原理：</p>
<ol>
<li>存储体：<strong>*存储体是主存储器中实际存储数据的物理部件</strong>。它通常由许多存储单元组成，每个存储单元都有一个唯一的地址。存储体的容量由存储单元的数量决定，每个存储单元可以存储一个或多个数据位。</li>
<li>存储地址寄存器：<strong>存储地址寄存器是用于存储要访问的存储单元地址的寄存器</strong>。在进行读写操作时，CPU会将要访问的存储单元地址存储到存储地址寄存器中，然后将读写命令发送给主存储器。</li>
<li>存储数据寄存器：<strong>存储数据寄存器是用于存储要读取或写入的数据的寄存器</strong>。在进行读操作时，主存储器将存储地址寄存器中指定地址的数据读取到存储数据寄存器中，并将数据传输给CPU；在进行写操作时，CPU将要写入的数据存储到存储数据寄存器中，然后将数据传输给主存储器，主存储器将数据写入到存储地址寄存器中指定地址的存储单元中。</li>
</ol>
<h2 id="存储体"><a href="#存储体" class="headerlink" title="存储体"></a>存储体</h2><p>下面我们来看看存储体的具体结构和知识点：</p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/存储体.png" alt="存储体"></p>
<p>这里有个容易混淆的知识点:</p>
<p>1个字=16bit，1个字节（Byte）=8bit。</p>
<p>1B=1个字节，1b=1个bit</p>
<p>可以像下面这样快速记忆：</p>
<p><strong>一个字占两个字节，一个字节占8个bit</strong>。</p>
<h1 id="运算器基本组成"><a href="#运算器基本组成" class="headerlink" title="运算器基本组成"></a>运算器基本组成</h1><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/运算器结构.png" alt="运算器"></p>
<h1 id="控制器基本结构"><a href="#控制器基本结构" class="headerlink" title="控制器基本结构"></a>控制器基本结构</h1><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/控制器结构.png" alt="控制器"></p>
<h1 id="计算机工作过程"><a href="#计算机工作过程" class="headerlink" title="计算机工作过程"></a>计算机工作过程</h1><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/计算机工作过程.png" alt="计算机工作过程"></p>
<p>具体工作过程如下：</p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/具体工作过程1.png" alt="具体工作过程"></p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/具体工作过程2.png" alt="具体工作过程"></p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/具体工作过程3.png" alt="具体工作过程"></p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/具体工作过程4.png" alt="具体工作过程"></p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/具体工作过程5.png" alt="具体工作过程"></p>
<p>计算机的具体工作过程总结如下：</p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/工作过程总结.png" alt="具体工作过程"></p>
<h1 id="计算机系统层次结构"><a href="#计算机系统层次结构" class="headerlink" title="计算机系统层次结构"></a>计算机系统层次结构</h1><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/计算机系统层次结构.png" alt="计算机系统层次结构"></p>
<p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/层次结构.png" alt="层次结构总结"></p>
<h1 id="计算机的性能指标"><a href="#计算机的性能指标" class="headerlink" title="计算机的性能指标"></a>计算机的性能指标</h1><h2 id="存储器的性能指标"><a href="#存储器的性能指标" class="headerlink" title="存储器的性能指标"></a>存储器的性能指标</h2><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/存储器的性能指标.png" alt="存储器的性能指标"></p>
<h3 id="重要知识点-存储单位"><a href="#重要知识点-存储单位" class="headerlink" title="重要知识点-存储单位"></a>重要知识点-存储单位</h3><p>这里有个要记住的关于存储单位知识点：</p>
<script type="math/tex; mode=display">2^{10}:K|2^{20}:M;|2^{30}:G;|2^{40}:T</script><h2 id="CPU的性能指标"><a href="#CPU的性能指标" class="headerlink" title="CPU的性能指标"></a>CPU的性能指标</h2><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/CPU性能指标.png" alt="CPU的性能指标"></p>
<p>CPU时钟周期是CPU执行一条指令所需的时间。</p>
<p>CPU主频（时钟频率）可以理解为一秒钟有几个时钟周期。</p>
<p>下面看一个例题：</p>
<blockquote>
<p>假设一个程序有100条指令，其中有10条指令需要访问内存，每次访问内存需要50个CPU时钟周期，另外90条指令不需要访问内存，每条指令平均需要2个CPU时钟周期。如果CPU主频为2 GHz，计算以下指标：</p>
<ol>
<li>CPI（Cycles Per Instruction）。</li>
<li>CPU执行时间。</li>
<li>IPS（Instructions Per Second）。</li>
</ol>
</blockquote>
<p>解：</p>
<blockquote>
<ol>
<li><p>计算CPI：<br>每条指令需要的CPU时钟周期数CPI = （访存指令数 × 访存指令平均CPU时钟周期数 + 非访存指令数 × 非访存指令平均CPU时钟周期数）/ 指令总数<br>其中，访存指令数为10，访存指令平均CPU时钟周期数为50，非访存指令数为90，非访存指令平均CPU时钟周期数为2，指令总数为100。代入公式可得：CPI = （10 × 50 + 90 × 2）/ 100 = 23<br>因此，CPI为23。</p>
</li>
<li><p>计算CPU执行时间：<br>CPU执行时间可以通过以下公式计算：</p>
<p>CPU执行时间 = CPU时钟周期数 / CPU主频 = （访存指令数 × 访存指令平均CPU时钟周期数 + 非访存指令数 × 非访存指令平均CPU时钟周期数）/ CPU主频</p>
<p>代入数据得：</p>
<p>CPU执行时间 = （10 × 50 + 90 × 2）/ (2 × 10^9) = 0.00046 秒</p>
</li>
<li><p>计算IPS：<br>IPS可以通过以下公式计算：IPS = CPU主频 / CPI<br>其中，CPI为23，CPU主频为2 GHz。代入公式可得：IPS = 2 × 10^9 / 23 = 86956522.22<br>因此，IPS为86956522.22。</p>
</li>
</ol>
</blockquote>
<h2 id="系统整体的性能指标"><a href="#系统整体的性能指标" class="headerlink" title="系统整体的性能指标"></a>系统整体的性能指标</h2><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/系统整体性能指标.png" alt="系统整体的性能指标"></p>
<h2 id="本节知识回顾"><a href="#本节知识回顾" class="headerlink" title="本节知识回顾"></a>本节知识回顾</h2><p><img src="/2023/05/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA/计算机性能指标回顾.png" alt="计算机性能指标回顾"></p>
<blockquote>
<p> 引用目录</p>
<p>1.《计算机组成原理》——白中英</p>
<p>2.《王道考研-计算机组成原理》</p>
</blockquote>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/" class="post-title-link" itemprop="url">计算机组成原理：存储系统</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-05 23:59:45" itemprop="dateCreated datePublished" datetime="2023-05-05T23:59:45+08:00">2023-05-05</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-05-21 17:42:38" itemprop="dateModified" datetime="2023-05-21T17:42:38+08:00">2023-05-21</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" itemprop="url" rel="index"><span itemprop="name">-计算机组成原理</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="存储系统概述"><a href="#存储系统概述" class="headerlink" title="存储系统概述"></a>存储系统概述</h1><h2 id="存储系统的层次结构"><a href="#存储系统的层次结构" class="headerlink" title="存储系统的层次结构"></a>存储系统的层次结构</h2><p>由于存储器的价格相对较高，而且在整机成本中占有较大的比例，因而从性能价格比的角度不能通过简单配置更大容量的存储器满足用户的需求。为此，必须使用某种策略解决成本和性能之间的矛盾。这一策略就是存储器分层，即利用不同容量、成本、功耗和速度的多种存储器构成有机结合的多级存储系统。构成多级存储系统的依据就是程序的局部性原理。</p>
<h3 id="1-程序的局部性原理"><a href="#1-程序的局部性原理" class="headerlink" title="1.程序的局部性原理"></a><font color="#1A94E6">1.程序的局部性原理</font></h3><p>程序的局部性可以从两个角度分析。 </p>
<ol>
<li>时间局部性：最近被访问的信息很可能还要被访问。 </li>
<li>空间局部性：最近被访问的信息邻近地址的信息也可能被访问。</li>
</ol>
<h3 id="2-多级存储系统的组成"><a href="#2-多级存储系统的组成" class="headerlink" title="2.多级存储系统的组成"></a><font color="#1A94E6">2.多级存储系统的组成</font></h3><p>最开始，CPU内部有少量的<font color="#1A94E6">寄存器</font>可以存储正在执行的指令或者正在参加运算的数据。正在执行的程序的指令和数据存储在<font color="#1A94E6">内存储器</font>中，内存储器速度高、容量小、价格高，由半导体器件构成。</p>
<p>为了扩大存储容量，在内存储器之外增加容量更大但访问速度稍慢的<font color="1A94E6">外存储器(外存)</font>， 或者称为<font color="1A94E6">辅助存储器(辅存)</font>。相对而言，外存储器速度低、容量大、价格便宜，可以由磁盘存储器、光盘存储器等非半导体器件或者固态半导体存储器构成。CPU 不能直接访问外存储器，外存储器的信息必须调入内存储器后才能由CPU 处理。</p>
<p>后来，随着半导体技术的发展，CPU 速度提高得更快，而更高速度的内存储器价格非常高。为此，人们在常规内存储器与 CPU之间增加了速度更高但容量更小的半导体<font color="#1A94E6">高速缓冲存储器</font>，即 <font color="#1A94E6">cache</font>，用于存放常规内存中正在使用的一些信息块的副本。常规的内存被称为<font color="#1A94E6">主存</font>。至此，<strong>内存储器就分为 cache 和主存两部分</strong>，由此构成了三级存储系统，其结构如下图所示。</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/三级存储结构.png" alt="三级存储结构示意图"></p>
<p>在三级存储系统中，cache 用于提升访问速度，以便使存取速度和CPU的运算速度相匹配；外存储器则主要解决存储容量问题，以满足计算机的大容量存储要求；并且由图可知，<strong>辅存中的数据必须读入主存后才可被CPU读取</strong>。</p>
<p>CPU、cache和主存储器之间的数据传输遵循一定的机制。CPU首先会向高速缓存发送请求，如果高速缓存中不存在所需的数据和指令，就会向主存储器发送请求。当主存储器将数据和指令传送回CPU时，它们会被存储到高速缓存中，以备下一次访问。</p>
<p>各级存储器价格、存储速度与容量关系如下图：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/金字塔.png" alt="三级存储金字塔"></p>
<h2 id="存储器的分类"><a href="#存储器的分类" class="headerlink" title="存储器的分类"></a>存储器的分类</h2><h3 id="按存储介质分类"><a href="#按存储介质分类" class="headerlink" title="按存储介质分类"></a>按存储介质分类</h3><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/存储介质.png" alt="按存储介质分类"></p>
<h3 id="按存取方式分类"><a href="#按存取方式分类" class="headerlink" title="按存取方式分类"></a>按存取方式分类</h3><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/存取方式.png" alt="按存取方式分类"></p>
<h3 id="按信息的可更改性分类"><a href="#按信息的可更改性分类" class="headerlink" title="按信息的可更改性分类"></a>按信息的可更改性分类</h3><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/信息的可更改性.png" alt="按信息的可更改性分类"></p>
<h3 id="按信息的可保存性分类"><a href="#按信息的可保存性分类" class="headerlink" title="按信息的可保存性分类"></a>按信息的可保存性分类</h3><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/信息的可保存性.png" alt="按信息的可保存性分类"></p>
<h2 id="存储器的性技术（性能）指标"><a href="#存储器的性技术（性能）指标" class="headerlink" title="存储器的性技术（性能）指标"></a>存储器的性技术（性能）指标</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/存储器的性能指标.png" alt="存储器的性能指标"></p>
<p>补充说明：<font color="#1A94E6">存储容量</font>指一个存储器中可存储的信息比特数，常用比特数(bit)或字节数 (B)来表示,也可使用 KB、MB、GB、TB 等单位。其中 1KB=210B，1MB=220B，1GB=230B，1TB=240B。为了清楚地表示其组织结构，存储容量也可表示为：存储字数(存储单元数)×存储字长(每单元的比特数)。例如，1Mbit 容量的存储器可以组织成 1M×1bit，也可组织成128K×8bit，或者 512K×4bit。</p>
<h1 id="静态随机存取存储器（SRAM和DRAM）"><a href="#静态随机存取存储器（SRAM和DRAM）" class="headerlink" title="静态随机存取存储器（SRAM和DRAM）"></a>静态随机存取存储器（SRAM和DRAM）</h1><p><strong><font color="#1A94E6">静态随机存取存储器</font>，即RAM，是易失性存储器，断电后数据丢失</strong>。</p>
<p>本节知识总览：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/DRAM_SRAM知识总览.png" alt="DRAM与SRAM知识总览"></p>
<h2 id="DRAM"><a href="#DRAM" class="headerlink" title="DRAM"></a>DRAM</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/DRAM.png" alt="DRAM介绍"></p>
<h2 id="栅极电容与双稳态触发器"><a href="#栅极电容与双稳态触发器" class="headerlink" title="栅极电容与双稳态触发器"></a>栅极电容与双稳态触发器</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/栅极电容与双稳态触发器.png" alt="栅极电容与双稳态触发器区别"></p>
<p>上面栅极电容与双稳态触发器的区别导致了DRAM与SRAM的区别：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/DRAMvsSRAM.png" alt="DRAM与SRAM区别"></p>
<h2 id="刷新"><a href="#刷新" class="headerlink" title="刷新"></a>刷新</h2><p>我们来看看什么是刷新：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/刷新.png" alt="何为刷新"></p>
<p>下面仔细解释刷新的概念：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/刷新详解.png" alt="刷新详解"></p>
<h2 id="为什么要用行列地址？"><a href="#为什么要用行列地址？" class="headerlink" title="为什么要用行列地址？"></a>为什么要用行列地址？</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/行列刷新.png" alt="为什么要用行列地址"></p>
<h2 id="DRAM的地址线复用技术"><a href="#DRAM的地址线复用技术" class="headerlink" title="DRAM的地址线复用技术"></a>DRAM的地址线复用技术</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/DRAM地址线复用技术.png" alt="DRAM的地址线复用技术"></p>
<h1 id="动态随机存储器"><a href="#动态随机存储器" class="headerlink" title="动态随机存储器"></a>动态随机存储器</h1><p><strong><font color="#1A94E6">静态随机存取存储器</font>，即ROM，是非易失性存储器，断电后数据不会丢失</strong>。</p>
<p>本节知识总览：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/ROM知识总览.png" alt="ROM知识总览"></p>
<h2 id="了解各种ROM"><a href="#了解各种ROM" class="headerlink" title="了解各种ROM"></a>了解各种ROM</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/了解各种ROM.png" alt="了解各种ROM"></p>
<h2 id="计算机内一种重要的ROM：BIOS"><a href="#计算机内一种重要的ROM：BIOS" class="headerlink" title="计算机内一种重要的ROM：BIOS"></a>计算机内一种重要的ROM：BIOS</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/BIOS.png" alt="BIOS"></p>
<h2 id="本节回顾"><a href="#本节回顾" class="headerlink" title="本节回顾"></a>本节回顾</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/ROM回顾.png" alt="ROM回顾"></p>
<h1 id="主存储器与CPU之间的连接"><a href="#主存储器与CPU之间的连接" class="headerlink" title="主存储器与CPU之间的连接"></a>主存储器与CPU之间的连接</h1><h2 id="本节总览"><a href="#本节总览" class="headerlink" title="本节总览"></a>本节总览</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/主存储器与CPU的连接总览.png" alt="主存储器与CPU的连接总览"></p>
<h2 id="CPU如何向主存读取数据"><a href="#CPU如何向主存读取数据" class="headerlink" title="CPU如何向主存读取数据"></a>CPU如何向主存读取数据</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/CPU如何向主存读写数据.png" alt="CPU如何向主存读写数据"></p>
<h2 id="存储器芯片的输入输出信号"><a href="#存储器芯片的输入输出信号" class="headerlink" title="存储器芯片的输入输出信号"></a>存储器芯片的输入输出信号</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/存储器芯片的输入输出信号.png" alt="存储器芯片的输入输出信号"></p>
<h2 id="增加主存的存储字长——位扩展"><a href="#增加主存的存储字长——位扩展" class="headerlink" title="增加主存的存储字长——位扩展"></a>增加主存的存储字长——位扩展</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/位扩展.png" alt="位扩展"></p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/位扩展2.png" alt="位扩展"></p>
<h2 id="增加储存的存贮字数——字扩展"><a href="#增加储存的存贮字数——字扩展" class="headerlink" title="增加储存的存贮字数——字扩展"></a>增加储存的存贮字数——字扩展</h2><h3 id="线选法"><a href="#线选法" class="headerlink" title="线选法"></a>线选法</h3><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/线选法字扩展.png" alt="字扩展"></p>
<p>这个方法有个缺点，上图右上角标注出来了。</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/译码片选法字扩展.png" alt="字扩展"></p>
<p>来看下面的例子：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/译码器片选法例子.png" alt="字扩展"></p>
<h3 id="线选法与译码片选法区别"><a href="#线选法与译码片选法区别" class="headerlink" title="线选法与译码片选法区别"></a>线选法与译码片选法区别</h3><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/线选法与译码片选法区别.png" alt="二者区别"></p>
<h2 id="字位同时扩展"><a href="#字位同时扩展" class="headerlink" title="字位同时扩展"></a>字位同时扩展</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/字位同时扩展.png" alt="字位同时扩展"></p>
<h2 id="本节回顾-1"><a href="#本节回顾-1" class="headerlink" title="本节回顾"></a>本节回顾</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/主存储器与CPU连接回顾.png" alt="回顾"></p>
<h1 id="双端口RAM和多模块存储器"><a href="#双端口RAM和多模块存储器" class="headerlink" title="双端口RAM和多模块存储器"></a>双端口RAM和多模块存储器</h1><h2 id="双端口RAM"><a href="#双端口RAM" class="headerlink" title="双端口RAM"></a>双端口RAM</h2><p>双端口RAM（Random Access Memory）是一种存储器，具有两个独立的数据端口，每个端口都可以同时读取或写入数据。它被设计用于解决多个设备同时访问存储器的并发性问题。</p>
<p>主要问题是多个设备（如处理器、图形处理器、DMA控制器等）需要同时读取或写入存储器中的数据。在传统的单端口RAM中，一次只能进行一次读取或写入操作，因此多个设备必须按照先后顺序进行访问，这可能会导致延迟和冲突。</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/双端口RAM.png" alt="双端口RAM"></p>
<h2 id="多体并行存储器"><a href="#多体并行存储器" class="headerlink" title="多体并行存储器"></a>多体并行存储器</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/多体并行存储器.png" alt="多体并行存储器"></p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/多体并行存储器1.png" alt="多体并行存储器"></p>
<p>其实低位交叉编织的读数据在5r后就结束了，但是要等待3r的回复时间，所以一共是T+4r=2T。</p>
<h2 id="应该取几个体"><a href="#应该取几个体" class="headerlink" title="应该取几个体"></a>应该取几个体</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/应该取几个体.png" alt="多体并行存储器"></p>
<h2 id="本节回顾-2"><a href="#本节回顾-2" class="headerlink" title="本节回顾"></a>本节回顾</h2><p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/双端口回顾.png" alt="多体并行存储器"></p>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/" class="post-title-link" itemprop="url">计算机组成原理：指令系统</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-05 21:41:30" itemprop="dateCreated datePublished" datetime="2023-05-05T21:41:30+08:00">2023-05-05</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-05-07 23:32:41" itemprop="dateModified" datetime="2023-05-07T23:32:41+08:00">2023-05-07</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" itemprop="url" rel="index"><span itemprop="name">-计算机组成原理</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="指令系统的发展与性能要求"><a href="#指令系统的发展与性能要求" class="headerlink" title="指令系统的发展与性能要求"></a>指令系统的发展与性能要求</h1><h2 id="什么是指令？什么是指令系统"><a href="#什么是指令？什么是指令系统" class="headerlink" title="什么是指令？什么是指令系统"></a>什么是指令？什么是指令系统</h2><p>首先来看什么是指令，<strong><font color="#1A94E6">指令</font>就是计算机要执行某种操作的命令</strong>。</p>
<p>从计算机组成的层次，指令可分为以下三类：</p>
<ol>
<li><font color="#1A94E6">微指令</font>：是微程序级的命令，属于硬件。</li>
<li><font color="#1A94E6">宏指令</font>：是由若干条机器指令组成的软件指令，属于软件。</li>
<li><strong><font color="#1A94E6">机器指令</font></strong>：介于微指令与宏指令之间，<strong>简称为<font color="#1A94E6">指令</font>，本章所讨论的指令都是机器指令</strong>。</li>
</ol>
<p>计算机程序就是由一系列的机器指令组成的。</p>
<p>再来看什么是指令系统。<strong><font color="#1A94E6">指令系统（指令集）</font>是指一台计算机中所有机器指令的集合</strong>。</p>
<p>指令是设计一台计算机的硬件与底层软件的接口。</p>
<h2 id="系列机"><a href="#系列机" class="headerlink" title="系列机"></a>系列机</h2><p><font color="#1A94E6">系列计算机</font>是指基本指令系统相同、基本体系结构相同的一系列计算机。一个系列往往有多种型号，不同型号在结构和性能上有差异。</p>
<p>系列机解决了各机种的兼容问题，因为同一系列的各机种有共同的指令系统，而且新推出的机种一定包含旧机种的全部指令。因此旧机种上运行的软件可以不加修改便可在新机种上运行，大大减少了软件开发费用。</p>
<h2 id="CISC与RISC"><a href="#CISC与RISC" class="headerlink" title="CISC与RISC"></a>CISC与RISC</h2><p>计算机硬件结构随着VLSI技术的飞速发展而越来越复杂化，大多数计算机的指令系统多达几百条，称这样的计算机为<font color="#1A94E6">复杂指令系统计算机</font>，简称<font color="#1A94E6">CISC</font>，由于这样的计算机采用了大量使用概率很低的复杂指令，所以人们又提出了便于VLSI技术实现的<font color="#1A94E6">精简指令系统计算机</font>，简称<font color="#1A94E6">RISC</font>。</p>
<p>CISC的指令集包含了许多复杂的指令，可以执行多种操作，每条指令的执行时间较长，但可以减少程序的执行时间。RISC的指令集则更加简单，每条指令执行时间短，但需要更多的指令才能完成同样的操作。</p>
<h2 id="指令系统的性能要求"><a href="#指令系统的性能要求" class="headerlink" title="指令系统的性能要求"></a>指令系统的性能要求</h2><p>指令系统的性能决定了计算机的基本功能，所以指令系统的设计是计算机系统设计中的一个核心问题。一个完善的指令系统应该满足以下四个方面的要求：</p>
<ol>
<li><font color="#1A94E6">完备性</font>：指令系统丰富、功能齐全、使用方便。</li>
<li><font color="#1A94E6">有效性</font>：利用该指令系统所编写的程序能够高效率地运行。</li>
<li><font color="#1A94E6">规整性</font>：包括指令系统的对称性、匀齐性、指令格式与数据格式的一致性。</li>
<li><font color="#1A94E6">兼容性</font>：系列机各机种之间具有相同的基本结构和共同的指令系统。</li>
</ol>
<h2 id="低级语言与硬件结构的关系"><a href="#低级语言与硬件结构的关系" class="headerlink" title="低级语言与硬件结构的关系"></a>低级语言与硬件结构的关系</h2><p>计算机语言有高级语言和低级语言之分。低级语言分为机器语言（二进制语言）和汇编语言（符号语言），它们和具体机器的指令系统密切相关。机器语言用指令代码编写程序，而符号语言利用助记符来编写程序。</p>
<h2 id="指令系统体系结构"><a href="#指令系统体系结构" class="headerlink" title="指令系统体系结构"></a>指令系统体系结构</h2><p>机器语言程序员看到的计算机的属性就是<font color="\#1A94E6">指令系统体系结构</font>，简称 <font color="#1A94E6">ISA</font>，是与程序设计有关的计算机架构。指令系统体系结构主要包括：寄存器组织， 存储器的组织和寻址方式，I/O 系统结构，数据类型及其表示，指令系统，中断机制，机器 工作状态的定义及切换，以及保护机制等</p>
<p><strong>它定义了一组机器指令和程序员可用的指令集</strong>。ISA是计算机硬件和软件之间的接口，它规定了计算机如何执行指令。</p>
<p>ISA是计算机体系结构中的关键组成部分，因为它决定了计算机可以执行哪些操作，以及如何执行这些操作。不同的计算机体系结构可能使用不同的ISA，这就导致了它们在执行相同任务时的性能和功耗等方面的差异。ISA的设计也是计算机架构师和软件开发人员需要考虑的重要因素之一。</p>
<h1 id="指令格式"><a href="#指令格式" class="headerlink" title="指令格式"></a>指令格式</h1><p>机器指令是用机器字来表示的。表示一条指令的机器字，就称为<font color="\#1A94E6">指令字</font>。</p>
<p><strong><font color="#1A94E6">指令格式</font>是指令字用二进制代码表示的结构形式</strong>，通常由操作码字段和地址码字段组成。<strong>操作码字段表征指令的操作特性与功能</strong>，而<strong>地址码字段通常指定参与操作的操作数的地址</strong>。因此，一条指令的结构可用如下形式来表示：</p>
<p><img src="/2023/05/05/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%EF%BC%9A%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/指令格式表示.png" alt="指令格式表示图"></p>
<h2 id="操作码"><a href="#操作码" class="headerlink" title="操作码"></a>操作码</h2><p>设计计算机时，对指令系统的每一条指令都要规定一个操作码，指令的操作码 OP 表示该指令应进行什么性质的操作。</p>
<p>组成操作码字段的位数一般取决于计算机指令系统的规模。较大的指令系统就需要更 多的位数来表示每条特定的指令。例如，一个指令系统只有 8 条指令，则有 3 位操作码就 够了(23 =8)。如果有 32 条指令，那么就需要 5 位操作码(25 =32)。一般来说，一个包含 n 位的操作码最多能够表示 2n 条指令。</p>
<h2 id="地址码"><a href="#地址码" class="headerlink" title="地址码"></a>地址码</h2>
      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/05/03/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%86%E5%9B%BE/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/05/03/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%86%E5%9B%BE/" class="post-title-link" itemprop="url">数据库原理：视图</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-05-03 21:57:41" itemprop="dateCreated datePublished" datetime="2023-05-03T21:57:41+08:00">2023-05-03</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-05-11 21:48:32" itemprop="dateModified" datetime="2023-05-11T21:48:32+08:00">2023-05-11</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/" itemprop="url" rel="index"><span itemprop="name">-数据库原理</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="视图介绍"><a href="#视图介绍" class="headerlink" title="视图介绍"></a>视图介绍</h1><p>视图是虚拟的表，与包含数据的表不一样，视图只包含使用时动态检索数据的查询。</p>
<p>假设我们需要从学生表中查询选修了数据库原理这门课的学生，有以下SQL语句：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Student.Sno,Sname,Sdept</span><br><span class="line"><span class="keyword">FROM</span> Student,SC,Course</span><br><span class="line"><span class="keyword">WHERE</span> Student.Sno <span class="operator">=</span> SC.Sno</span><br><span class="line">	<span class="keyword">AND</span> SC.Cno <span class="operator">=</span> Course.Cno</span><br><span class="line">	<span class="keyword">AND</span> Course.Cname <span class="operator">=</span> <span class="string">'数据库原理'</span>;</span><br></pre></td></tr></tbody></table></figure>
<p>我们可以把上面的查询包装成一个名为<code>ChoiceDBStudents</code>的虚拟表（视图），则可以像下面这样轻松地检索出数据：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Sno,Sname,Sdept</span><br><span class="line"><span class="keyword">FROM</span> ChoiceDBStudents</span><br></pre></td></tr></tbody></table></figure>
<p>这就是视图的作用。<code>ChoiceDBStudents</code>是一个视图，不包含任何数据，包含的是一个查询。</p>
<h1 id="为什么使用视图"><a href="#为什么使用视图" class="headerlink" title="为什么使用视图"></a>为什么使用视图</h1><p>下面是使用视图的一些好处和常见应用：</p>
<ol>
<li>重用SQL语句。</li>
<li>简化复杂的SQL操作。</li>
<li>使用表的一部分。</li>
<li>保护数据，可以授予用户访问表的特定部分的权限，而不是整个表的访问权限。</li>
<li>更改数据格式和表示，视图可返回与底层表的表示和格式不同的数据。</li>
</ol>
<p>创建视图之后，<strong>可以像使用基本表一样使用视图</strong>，可以对视图执行<code>SELECT</code>操作，过滤和排序数据，将视图联结到其他视图或表，甚至添加和更新数据。</p>
<p>重要的是，视图本身并不包含数据，返回的数据是从其他表中检索出来的，再添加或更改这些表中的数据时，视图将返回改变过的数据。</p>
<h1 id="创建视图"><a href="#创建视图" class="headerlink" title="创建视图"></a>创建视图</h1><p>视图用<code>CREATE VIEW</code>语句来创建，格式如下：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> <span class="operator">&lt;</span>视图名<span class="operator">&gt;</span> [(<span class="operator">&lt;</span>列名<span class="operator">&gt;</span> [,<span class="operator">&lt;</span>列名<span class="operator">&gt;</span>]···)]</span><br><span class="line"><span class="keyword">AS</span> <span class="operator">&lt;</span>子查询<span class="operator">&gt;</span></span><br><span class="line">[<span class="keyword">WITH</span> <span class="keyword">CHECK</span> OPTION]</span><br></pre></td></tr></tbody></table></figure>
<p>其中，子查询可以是任意的<code>SELECT</code>语句，是否可以含有<code>ORDER BY</code>子句和<code>DISTINCT</code>短语取决于具体系统的实现。<code>WITH CHECK OPTION</code>表示对视图进行<code>UPDATE</code>、<code>INSERT</code>、和<code>DELETE</code>操作时要保证操作的行满足视图定义中的谓词条件，即符合<code>WHERE</code> 子句的条件。</p>
<p>看下面的例子，建立信息系学生的视图，并要求进行修改和插入操作时仍需保证该视图只有信息系的学生：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> IS_Student</span><br><span class="line"><span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> Sno,Sname,Sage</span><br><span class="line"><span class="keyword">FROM</span> Student</span><br><span class="line"><span class="keyword">WHERE</span> Sdept <span class="operator">=</span> <span class="string">'信息系'</span></span><br><span class="line"><span class="keyword">WITH</span> <span class="keyword">CHECK</span> OPTION;</span><br></pre></td></tr></tbody></table></figure>
<h2 id="建立在多个基本表上的视图"><a href="#建立在多个基本表上的视图" class="headerlink" title="建立在多个基本表上的视图"></a>建立在多个基本表上的视图</h2><p>建立信息系选修了1号课程的学生的视图（包括学号、姓名、成绩）：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> IS_S1</span><br><span class="line"><span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> Student.Sno,Sname,Grade</span><br><span class="line"><span class="keyword">FROM</span> Student,SC</span><br><span class="line"><span class="keyword">WHERE</span> Sdept <span class="operator">=</span> <span class="string">'信息系'</span></span><br><span class="line">	<span class="keyword">AND</span> Student.Sno <span class="operator">=</span> SC.Sno</span><br><span class="line">	<span class="keyword">AND</span> SC.Cno <span class="operator">=</span> <span class="string">'1'</span>;</span><br></pre></td></tr></tbody></table></figure>
<p>建立的视图如下：</p>
<p><img src="/2023/05/03/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%86%E5%9B%BE/视图1.png" alt="信息系选修1号课程的学生视图"></p>
<p>上面的例子中，由于视图<code>IS_S1</code>的属性列中包含了与<code>Student</code>表和<code>SC</code>表的同名列<code>Sno</code>，所以必须在视图名后面明确说明视图的各个属性列名。</p>
<h2 id="何时需要在视图名后面指定属性名"><a href="#何时需要在视图名后面指定属性名" class="headerlink" title="何时需要在视图名后面指定属性名"></a>何时需要在视图名后面指定属性名</h2><p>在创建视图时，如果视图的列名和底层表的列名一样，则不需要在视图名后面明确说明视图的各个属性列名。这是因为，视图已经包含了底层表的列名和对应的数据，因此在查询视图时可以直接使用视图的列名。</p>
<p>但是，在以下情况下，可能需要在视图名后面明确说明视图的各个属性列名：</p>
<ol>
<li>当视图的列名与底层表的列名不一致时，需要为视图的每个列明确指定列名。在这种情况下，视图的列名可以是任意名称，只要在查询视图时使用相应的列名即可。</li>
<li>当视图的定义中使用了计算列或函数等，这些列可能没有直接对应的列名。在这种情况下，需要为视图的计算列或函数指定别名，以便在查询视图时使用。</li>
<li>当视图的定义中包含了多个表时，如果这些表中有相同的列名，那么在查询视图时，需要明确指定每个列所属的表名或别名，以避免产生歧义。</li>
</ol>
<h1 id="使用视图"><a href="#使用视图" class="headerlink" title="使用视图"></a>使用视图</h1><h2 id="在一个已有的视图上建立另一个视图"><a href="#在一个已有的视图上建立另一个视图" class="headerlink" title="在一个已有的视图上建立另一个视图"></a>在一个已有的视图上建立另一个视图</h2><p>建立信息系选修了1号课程且成绩在90分以上的学生的视图：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> IS_S2</span><br><span class="line"><span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> Sno,Sname,Grade</span><br><span class="line"><span class="keyword">FROM</span> IS_S1</span><br><span class="line"><span class="keyword">WHERE</span> Grade <span class="operator">&gt;=</span> <span class="number">90</span>;</span><br></pre></td></tr></tbody></table></figure>
<p>建立的视图如下；</p>
<p><img src="/2023/05/03/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%86%E5%9B%BE/视图2.png" alt="信息系选修了1号课程且成绩在90分以上的学生的视图"></p>
<h2 id="带表达式的视图"><a href="#带表达式的视图" class="headerlink" title="带表达式的视图"></a>带表达式的视图</h2><p>定义基本表时，表中只存放基本数据，由基本数据经过各种计算派生出的数据一般是不存储的。由于视图中的数据也是不实际存储的，所以定义视图时可以根据应用的需要设置一些派生属性列。这些派生属性列由于在基本表中并不实际存在，也成它们为<strong>虚拟列</strong>。带虚拟列的视图被称为<strong>带表达式的视图</strong>。</p>
<p>看一个例子，定义一个反映学生出生年份的视图（假设今年为2023年）：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> BT_S(Sno,Sname,Sbirth)</span><br><span class="line"><span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> Sno,Sname,<span class="number">2023</span><span class="operator">-</span>Sage</span><br><span class="line"><span class="keyword">FROM</span> Student;</span><br></pre></td></tr></tbody></table></figure>
<p>建立的视图如下：</p>
<p><img src="/2023/05/03/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%86%E5%9B%BE/视图3.png" alt="反映学生出生年份的视图"></p>
<h2 id="分组视图"><a href="#分组视图" class="headerlink" title="分组视图"></a>分组视图</h2><p>上面的视图<code>BT_S</code>是一个带表达式的视图。<strong>视图中的出生年份是通过计算得到的</strong>。还可以用带有聚集函数和<code>GROUP BY</code>子句的查询来定义视图，这种视图称为<strong>分组视图</strong>。</p>
<p>来看一个例子，将学生的学号及平均成绩定义为一个视图：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> S_G(Sno,Gavg)</span><br><span class="line"><span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> Sno,<span class="built_in">AVG</span>(Grade)</span><br><span class="line"><span class="keyword">FROM</span> SC</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> Sno;</span><br></pre></td></tr></tbody></table></figure>
<p>建立的视图如下：</p>
<p><img src="/2023/05/03/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86%EF%BC%9A%E8%A7%86%E5%9B%BE/视图4.png" alt="学生的学号及平均成绩视图"></p>
<h1 id="删除视图"><a href="#删除视图" class="headerlink" title="删除视图"></a>删除视图</h1><p>删除视图用<code>DROP</code>语句，格式如下：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">VIEW</span> <span class="operator">&lt;</span>视图名<span class="operator">&gt;</span> [CASCADE]</span><br></pre></td></tr></tbody></table></figure>
<p><strong>如果欲删除的视图还导出了其他视图，应使用<code>CASCADE</code>将其导出的视图一并删除</strong>。</p>
<p>如果欲删除的视图导出了其他视图，但删除时没用<code>CASCADE</code>，则会导致删除失败。</p>
<h1 id="查询视图"><a href="#查询视图" class="headerlink" title="查询视图"></a>查询视图</h1>
      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/04/28/java%EF%BC%9A%E5%BC%82%E5%B8%B8%E7%B1%BB%E4%B8%8E%E6%8D%95%E8%8E%B7%E5%BC%82%E5%B8%B8/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/04/28/java%EF%BC%9A%E5%BC%82%E5%B8%B8%E7%B1%BB%E4%B8%8E%E6%8D%95%E8%8E%B7%E5%BC%82%E5%B8%B8/" class="post-title-link" itemprop="url">Java：异常类与捕获异常</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-04-28 10:58:16" itemprop="dateCreated datePublished" datetime="2023-04-28T10:58:16+08:00">2023-04-28</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-06-15 13:37:06" itemprop="dateModified" datetime="2023-06-15T13:37:06+08:00">2023-06-15</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%90%8E%E7%AB%AF/" itemprop="url" rel="index"><span itemprop="name">-后端</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="异常引发"><a href="#异常引发" class="headerlink" title="异常引发"></a>异常引发</h1><p>我们肯定见过<strong>堆栈轨迹</strong>，也就是程序执行过程中某个特定点上挂起的方法调用列表。当程序因为未捕获的异常而终止时，就会显示堆栈轨迹。异常会因为程序本身或者错误的操作等情况引发，这会导致操作无法完成或者数据丢失等不良后果。为了避免异常带来的不良后果，程序应该在异常发生时保证：</p>
<ol>
<li>向用户通知错误；</li>
<li>让用户返回到一种安全状态，让用户执行其他的命令；</li>
<li>允许用户保存工作结果，以妥善的方式终止程序。</li>
</ol>
<p>异常处理的任务就是将控制权从产生异常的地方，转移到能够处理异常的异常处理器。异常处理通常需要考虑：</p>
<ol>
<li><strong>用户输入错误</strong>，当需要用户进行输入时，用户可能不会按照程序的要求来输入；</li>
<li><strong>设备错误</strong>，程序调用的硬件出现问题；</li>
<li><strong>物理限制</strong>，例如程序所需的存储空间耗尽；</li>
<li><strong>代码错误</strong>，程序有的方法编写错误，引发异常。</li>
</ol>
<p>传统的方式是返回一个特殊的错误码，方法根据错误码进行分析。或者是返回 null 引用，但无论是空引用和错误码，这些都是程序编写中可能会使用的值。因此在很多情况下，方法并不返回任何值，而是抛出一个封装了错误信息的对象。</p>
<h1 id="异常类"><a href="#异常类" class="headerlink" title="异常类"></a>异常类</h1><p>异常对象都派生自<code>Throwable</code>类的一个实例，所有异常都继承<code>Throwable</code>类而来。==<code>Throwable</code>类分为<code>Error</code>类和<code>Exception</code>类==，<code>Error</code>类表示程序运行时系统出现的严重错误，通常是无法恢复的，捕获和处理这类异常没有意义，所以==<code>Error</code>类异常不需要我们操心==。<code>Exception</code> 类又扩展为两个类：<code>IOException</code> 和 <code>RuntimeException</code>。<code>IOException</code>类的错误与程序本身没有关系，==我们只需要考虑<code>Exception</code> 类的异常==。所以，<strong>如果出现<code>RuntimeException</code>异常，一定是程序员本身的问题</strong>。</p>
<p><img src="/2023/04/28/java%EF%BC%9A%E5%BC%82%E5%B8%B8%E7%B1%BB%E4%B8%8E%E6%8D%95%E8%8E%B7%E5%BC%82%E5%B8%B8/异常类.png" alt="异常类派生图"></p>
<p>派生于 <code>Error</code>类和<code>RuntimeException</code>类的所有异常为<strong>非检查型</strong>异常，其他所有异常为<strong>检查型</strong>异常。</p>
<h1 id="声明异常"><a href="#声明异常" class="headerlink" title="声明异常"></a>声明异常</h1><p>当调用某个方法发生异常时，这个方法需要抛出发生的异常，编译器才知道程序出现了何种异常，系统才能搜索处理对应异常的<strong>异常处理器</strong>。</p>
<p>我们要在方法声明中使用<code>throws</code>关键字来声明方法可能抛出的异常类型：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">afunction</span><span class="params">()</span> <span class="keyword">throws</span> aException {···}</span><br></pre></td></tr></tbody></table></figure>
<p>如果一个方法可能会抛出多个异常，我们需要声明所有异常，用逗号隔开这些异常：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">afuncion</span><span class="params">()</span> <span class="keyword">throws</span> aException,anotherException {···}</span><br></pre></td></tr></tbody></table></figure>
<p>Error 和 RuntimeException 的非检查型异常都不需要被声明，因为这是程序员一开始就需要避免的事情。因此一个方法需要声明所有可能抛出的检查型异常，而不是非检查型。</p>
<h1 id="抛出异常"><a href="#抛出异常" class="headerlink" title="抛出异常"></a>抛出异常</h1><p>在程序执行过程中，使用 throw 关键字将一个异常对象抛出，使程序进入异常处理流程。抛出异常通常用于表示程序在执行过程中遇到了无法处理的异常情况，例如文件读写失败、网络连接中断等。</p>
<p>要注意的是，一旦异常被抛出，方法就不会返回到它的调用者。</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ExceptionName</span>()</span><br></pre></td></tr></tbody></table></figure>
<p>下面来看一个例子：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">divide</span><span class="params">(<span class="type">int</span> a, <span class="type">int</span> b)</span> <span class="keyword">throws</span> ArithmeticException {</span><br><span class="line">        <span class="keyword">if</span> (b == <span class="number">0</span>) {</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ArithmeticException</span>(<span class="string">"除数不能是0！"</span>);</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">return</span> a / b;</span><br><span class="line">    }</span><br></pre></td></tr></tbody></table></figure>
<p>在上面的<code>divide</code>方法中，如果除数是0，就抛出异常，若不是0就正常返回<code>a/b</code>。</p>
<p>异常类中可能有自带一个字符串参数的构造器，通过这个构造器可以给出异常的描述信息。例<code>IllegalArgumentException</code>异常可以通过它的构造器附带说明信息：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">"这是个不合法的参数异常"</span>);</span><br></pre></td></tr></tbody></table></figure>
<h1 id="创建异常类"><a href="#创建异常类" class="headerlink" title="创建异常类"></a>创建异常类</h1><p>程序可能遇到某种特殊的异常，这种异常用现有的异常类可能很难描述，此时可以自定义一个异常类。自定义的异常类派生于<code>Excpetion</code>类或者<code>Excpetion</code>类的某个子类，自定义的类应该包括默认构造器和包含详细描述信息的构造器。例如：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">FileFormatException</span> <span class="keyword">extends</span> <span class="title class_">IOException</span></span><br><span class="line">{</span><br><span class="line">      <span class="keyword">public</span> <span class="title function_">FileFormatException</span><span class="params">()</span> {}</span><br><span class="line">      <span class="keyword">public</span> <span class="title function_">FileFormatException</span><span class="params">(String message)</span> {</span><br><span class="line">            <span class="built_in">super</span>(message);</span><br><span class="line">      }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>自定义异常类之后，就可以在方法中声明异常并在方法中抛出。</p>
<p>==注意，<code>message</code>字段不用再自定义的异常类中添加，只需要调用<code>super()</code>构造器将其传到<code>Exception</code>类即可==。</p>
<h1 id="捕获异常"><a href="#捕获异常" class="headerlink" title="捕获异常"></a>捕获异常</h1><p>上面说到了抛出异常，如果只抛出异常而不捕获异常，程序就会终止，正确的做法是抛出异常后并捕获异常，提供异常处理办法。</p>
<h2 id="try-catch子句"><a href="#try-catch子句" class="headerlink" title="try/catch子句"></a>try/catch子句</h2><p>使用 try 和 catch 关键字可以捕获异常，try/catch 语句块应该被放置在可能产生异常的地方，使用 try/catch 的语法如下：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>{</span><br><span class="line">   <span class="comment">//code</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span>(ExceptionName e){</span><br><span class="line">   <span class="comment">//code</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>如果 try 语句中的任何代码抛出了 catch 子句指定的一个异常类，则程序会跳过 try 语句块的剩余代码，转去执行 catch 子句中的处理器代码。如果 try 语句块的代码没有抛出任何异常，则 catch 子句的代码会被自动跳过。==如果方法抛出了 catch 子句中没有声明的一个异常类型，这个方法就会自动退出==。</p>
<h2 id="捕获多个异常"><a href="#捕获多个异常" class="headerlink" title="捕获多个异常"></a>捕获多个异常</h2><p>一个 try 代码块后面可以跟随多个 catch 代码块，对每个异常类型都用一个单独的 catch 子句来实现<strong>多个异常的捕获</strong>。</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>{</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span>(异常类型 <span class="number">1</span> 异常的变量名 <span class="number">1</span>){</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span>(异常类型 <span class="number">2</span> 异常的变量名 <span class="number">2</span>){</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span>(异常类型 <span class="number">3</span> 异常的变量名 <span class="number">3</span>){</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>同一个 catch 子句可以捕获多个异常，如果 2 种异常捕获后采取的解决办法是相同的，可以用<code>|</code>进行连接。</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>{</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span>(异常类型<span class="number">1</span> | 异常类型<span class="number">2</span> 异常的变量名){</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<h2 id="异常链条"><a href="#异常链条" class="headerlink" title="异常链条"></a>异常链条</h2><p>待补充</p>
<h2 id="final子句"><a href="#final子句" class="headerlink" title="final子句"></a>final子句</h2><p><code>finally</code>关键字用来创建在<code>try</code>代码块后面执行的代码块，无论是否发生异常，<code>finally</code>代码块中的代码总会被执行。在 <code>finally</code>代码块中，可以运行清理类型等收尾善后性质的语句。语法为：</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>{</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span>(异常类型 异常的变量名){</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">finally</span>{</span><br><span class="line">  <span class="comment">//code</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p><code>try</code>语句可以只有<code>finally</code>子句，而忽略<code>catch</code>子句。不过<code>finally</code>子句也可能有异常，可以使用嵌套的<code>try</code>子句来捕获异常，这种方法不仅保险且功能更强。</p>
<figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>{</span><br><span class="line">      <span class="keyword">try</span>{</span><br><span class="line">            <span class="comment">//code</span></span><br><span class="line">      }</span><br><span class="line">      <span class="keyword">finally</span>{</span><br><span class="line">            <span class="comment">//code</span></span><br><span class="line">      }</span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span>(异常类型 异常的变量名)</span><br><span class="line">{</span><br><span class="line">      <span class="comment">//code</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<h2 id="try-with-Resources-语句"><a href="#try-with-Resources-语句" class="headerlink" title="try-with-Resources 语句"></a>try-with-Resources 语句</h2><p>待补充（不考）</p>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/04/26/CSS%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%85%83%E7%B4%A0%E5%8F%8A%E8%87%AA%E9%80%82%E5%BA%94%E5%B8%83%E5%B1%80/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/04/26/CSS%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%85%83%E7%B4%A0%E5%8F%8A%E8%87%AA%E9%80%82%E5%BA%94%E5%B8%83%E5%B1%80/" class="post-title-link" itemprop="url">CSS：块级元素细节</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2023-04-26 18:59:34" itemprop="dateCreated datePublished" datetime="2023-04-26T18:59:34+08:00">2023-04-26</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar-check"></i>
      </span>
      <span class="post-meta-item-text">更新于</span>
      <time title="修改时间：2023-05-04 21:25:32" itemprop="dateModified" datetime="2023-05-04T21:25:32+08:00">2023-05-04</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%89%8D%E7%AB%AF/" itemprop="url" rel="index"><span itemprop="name">-前端</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="清除浮动带来的影响"><a href="#清除浮动带来的影响" class="headerlink" title="清除浮动带来的影响"></a>清除浮动带来的影响</h1><p>假设有一个父盒子，内部有一个子元素，子元素设置了右浮动，此时父盒子高度会因为浮动的影响变成0，可以采用给父级盒子添加<code>clear:after</code>的CSS样式来清除内部元素浮动带来的影响，看下面的例子：</p>
<figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">'box clear'</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span>&gt;</span>第一个<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span>&gt;</span>第二个<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span>&gt;</span>第三个<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.box</span> {</span><br><span class="line">  <span class="attribute">background</span>: green;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">ul</span> {</span><br><span class="line">  <span class="attribute">float</span>: right;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.clear</span><span class="selector-pseudo">:after</span> {</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">''</span>;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">clear</span>: both;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">li</span> {</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">30vh</span>;</span><br><span class="line">  <span class="attribute">list-style</span>: none;</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">background</span>: pink;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>效果如下：(注意要使用*通配符选择器将网页默认的<code>margin</code>与<code>padding</code>设置为0)</p>
<p><img src="/2023/04/26/CSS%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%85%83%E7%B4%A0%E5%8F%8A%E8%87%AA%E9%80%82%E5%BA%94%E5%B8%83%E5%B1%80/清除浮动.png" alt="清除浮动效果图"></p>
<h1 id="盒子具体组成细节"><a href="#盒子具体组成细节" class="headerlink" title="盒子具体组成细节"></a>盒子具体组成细节</h1><p>Html中，每个盒子都由一个外盒子和一个内盒子组成。外盒子负责元素是在一行显示还是换行显示，而内盒子负责宽高和内容显示。这也是为什么<code>display</code>属性为<code>inline-block</code>的盒子既能在一行显示又能设置宽高的原因。</p>
<p>由此我们也知道了，<code>width</code>和<code>height</code>属性是作用在内盒子，也就是<strong>容器盒子</strong>上的。</p>
<h1 id="width-auto的具体作用细节"><a href="#width-auto的具体作用细节" class="headerlink" title="width:auto的具体作用细节"></a>width:auto的具体作用细节</h1><h2 id="属性-width-auto"><a href="#属性-width-auto" class="headerlink" title="属性 - width:auto"></a>属性 - width:auto</h2><p><code>auto</code>是<code>width</code>属性的默认值，也即不设置<code>width</code>属性时，默认是<code>width: auto</code>，此时会有以下几种表现：</p>
<ol>
<li>流动性：块级元素宽度默认为父级容器的100%。</li>
<li>包裹性：浮动、绝对定位、<code>inline-block</code>元素会将宽度收缩到完全包裹子元素，下面会细说包裹性。</li>
<li>收缩到最小：</li>
<li>超出容器限制：</li>
</ol>
<p>下面我们在<strong>外部尺寸</strong>和<strong>内部尺寸</strong>的知识点里来具体说说上面提到的几种宽度表现。</p>
<h3 id="外部尺寸与流体特性"><a href="#外部尺寸与流体特性" class="headerlink" title="外部尺寸与流体特性"></a>外部尺寸与流体特性</h3><h4 id="流动性"><a href="#流动性" class="headerlink" title="流动性"></a>流动性</h4><p>首先来看<strong>流动性</strong>，流动性就是块级元素默认会铺满父元素，在不设置<code>width</code>属性或<code>width</code>属性为<code>auto</code>的情况下。</p>
<p>要牢记，表现为外部尺寸的块级元素一旦设置了宽度，流动性就丢失了。流动性，也是指<code>margin/border/padding</code>和<code>content</code>内容区域自动分配水平空间的机制。</p>
<p>我们来看一个垂直导航的例子：</p>
<figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">'leftBar'</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"nav"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">""</span>&gt;</span>导航1<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">""</span>&gt;</span>导航2<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">""</span>&gt;</span>导航3<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">* {</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.leftBar</span> {</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">200px</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.nav</span> {</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#cd0000</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.nav</span> <span class="selector-tag">a</span> {</span><br><span class="line">  <span class="attribute">text-decoration</span>: none;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">9px</span> <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">border-bottom</span>: <span class="number">1px</span> solid <span class="number">#b70000</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure>
<p>效果如下：</p>
<p><img src="/2023/04/26/CSS%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%85%83%E7%B4%A0%E5%8F%8A%E8%87%AA%E9%80%82%E5%BA%94%E5%B8%83%E5%B1%80/垂直导航.png" alt="垂直导航效果图"></p>
<p>我们没有给<code>display</code>属性为<code>block</code>的<code>a</code>标签指定宽度，所以它会自动铺满它的容器（父元素<code>div.nav</code>），而元素<code>div.nav</code>也没有设置<code>width</code>宽度属性，所以会继续铺满它的父元素<code>div.leftBar</code>，我们给<code>div.leftBar</code>设置了<code>width</code>为<code>200px</code>，所以最终的效果就如上图所示。</p>
<p>上面的例子很好地体现了<strong>流动性</strong>，块级元素没有设置<code>width</code>属性或<code>width</code>属性为<code>auto</code>时会铺满父元素。</p>
<h4 id="格式化宽度"><a href="#格式化宽度" class="headerlink" title="格式化宽度"></a>格式化宽度</h4><p>对于<strong>非替换元素</strong>，当<code>left/right</code>或<code>top/bottom</code>对立方位的属性值同时存在时，元素的宽度表现为<strong>格式化宽度</strong>，也就是该元素的宽度大小相对于最近的==具有定位特性==的祖先元素计算。来看下面的例子：</p>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">div</span> {</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">20px</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>假设该<code>div</code>元素最近的具有定位特性的祖先元素的宽度是1000像素，那么这个<code>div</code>元素的宽度就是960（1000-20-20）像素。</p>
<p>格式化宽度也具有完全的<strong>流体性</strong>，格式化宽度水很深，也很实用，具体会在定位的笔记中说到。</p>
<h3 id="内部尺寸与流体特性"><a href="#内部尺寸与流体特性" class="headerlink" title="内部尺寸与流体特性"></a>内部尺寸与流体特性</h3><p>所谓<strong>内部尺寸</strong>，简单点说就是元素的尺寸由内部的元素决定。当元素里没有内容宽度是0时，该元素应用的就是内部尺寸。</p>
<h4 id="包裹性"><a href="#包裹性" class="headerlink" title="包裹性"></a>包裹性</h4><p>简单来说，<strong>包裹性</strong>就是父元素的宽度会收缩到与内部元素宽度一致。</p>
<p>那么包裹性的条件是什么呢?当元素为<code>absolute、fixed、float、inline-block</code>时就会具有包裹性。（个人猜测，所有能产生<strong>BFC</strong>的元素都具有包裹性。）</p>
<p>应用场景：当遇到内部元素宽度不确定，又需要给外部元素限定宽度时，就可以通过给父元素设置<code>inline-block</code>让父元素宽度自适应子元素宽度。</p>
<p>我们来看一个水平导航的例子：</p>
<figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"nav"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">""</span>&gt;</span>导航1<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">""</span>&gt;</span>导航2<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">""</span>&gt;</span>导航3<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">* {</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.nav</span> {</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#cd0000</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.nav</span> <span class="selector-tag">a</span> {</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">3px</span> <span class="number">6px</span>;</span><br><span class="line">  <span class="attribute">border-right</span>: <span class="number">2px</span> solid <span class="number">#b70000</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>效果如下：</p>
<p><img src="/2023/04/26/CSS%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%85%83%E7%B4%A0%E5%8F%8A%E8%87%AA%E9%80%82%E5%BA%94%E5%B8%83%E5%B1%80/水平导航.png" alt="水平导航效果图"></p>
<p>这里给<code>a</code>标签设置<code>inline-block</code>是为了让其上下<code>padding</code>生效，因为内联元素的上下<code>padding</code>与<code>margin</code>是不起作用的。</p>
<p>包裹性对实际开发还有个例子，看下面的需求：</p>
<p>页面某个模块的文字内容是动态的，希望字少时居中显示，字多时居左显示，看下面的代码实现：</p>
<figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"content"</span>&gt;</span>文字较少时居中显示<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"content"</span>&gt;</span>文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  文字较多时居左显示  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">* {</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.box</span> {</span><br><span class="line">  <span class="attribute">text-align</span>: center;</span><br><span class="line">  <span class="attribute">background-color</span>: red;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">20px</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.content</span> {</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">text-align</span>: left;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>效果如下：</p>
<p><img src="/2023/04/26/CSS%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%85%83%E7%B4%A0%E5%8F%8A%E8%87%AA%E9%80%82%E5%BA%94%E5%B8%83%E5%B1%80/文字显示效果.png" alt="文字显示效果图"></p>
<p>这个例子的实现原理很重要：当文字较少时，<code>.content</code>并没有宽高，并且设置了<code>inline-block</code>属性，所以此时它相当于一个行内元素，<code>text-align: left</code>属性对<code>.content</code>不起作用，并且受到<code>.box</code>的<code>text-align: center</code>影响居中显示文本。当文字变多后，<code>.content</code>会宽度超过<code>.box</code>宽度会自动换行，此时它有了宽高，<code>text-align: left</code>属性开始对<code>.content</code>起作用，使得文本居左显示。</p>
<h4 id="首选最小宽度"><a href="#首选最小宽度" class="headerlink" title="首选最小宽度"></a>首选最小宽度</h4><p><strong>首选最小宽度</strong>就是指元素最适合的最小宽度，当容器宽度为0时，内部<code>inline-block</code>元素的宽度不会是0，而是根据该元素内容决定的首选最小宽度。具体规则如下：</p>
<ol>
<li>汉字最小宽度为每个汉字的宽度。</li>
<li>西方文字最小宽度为连续的英文字符单元的宽度，而终止与非英文字符，也就是碰到非英文字符就换行。</li>
<li>类似图片的替换元素最小宽度就是该元素内容本身。</li>
</ol>
<p>下面来看首选最小宽度应用的一个例子：</p>
<figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"ao"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.ao</span> {</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ao</span><span class="selector-pseudo">:before</span> {</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">"love你love"</span>;</span><br><span class="line">  <span class="attribute">outline</span>: <span class="number">2px</span> solid <span class="number">#cd0000</span>;</span><br><span class="line">  <span class="comment">/*color: #fff;*/</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<p>效果如下：</p>
<p><img src="/2023/04/26/CSS%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%85%83%E7%B4%A0%E5%8F%8A%E8%87%AA%E9%80%82%E5%BA%94%E5%B8%83%E5%B1%80/首选最小宽度.png" alt="首选最小宽度效果图"></p>
<p>将文字颜色改为白色即可彻底实现画出“凹”的形状。</p>
<h4 id="最大宽度"><a href="#最大宽度" class="headerlink" title="最大宽度"></a>最大宽度</h4><p><strong>最大宽度</strong>就是元素可以有的最大宽度。如果内部没有块级元素或块级元素没有设置宽度，则最大宽度就是==最大的连续内联盒子的宽度==。</p>
<h1 id="width含具体数值时的具体作用细节"><a href="#width含具体数值时的具体作用细节" class="headerlink" title="width含具体数值时的具体作用细节"></a>width含具体数值时的具体作用细节</h1><p>内在盒子又被分为<code>content box</code>、<code>padding box</code>、<code>border box</code>和<code>margin box</code>四个盒子。其中<code>margin box</code>作用不大，可以忽略，并且盒子本身的宽度不受其影响。</p>
<p><code>width</code>属性赋的值是作用在<code>content box</code>上的，来看下面的例子：</p>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">div</span> {<span class="attribute">width</span>: <span class="number">100px</span>; <span class="attribute">padding</span>: <span class="number">20px</span>; <span class="attribute">border</span>: <span class="number">20px</span> solid;}</span><br></pre></td></tr></tbody></table></figure>
<p>上面的例子的<code>width: 100px</code>就是作用在内容盒子<code>content box</code>上的，最终盒子的尺寸应为100+20×2+20×2=180px。</p>
<p>上面所说的宽度表现有不合理的地方，主要有下面说的两点。</p>
<h2 id="流动性丢失"><a href="#流动性丢失" class="headerlink" title="流动性丢失"></a>流动性丢失</h2><p>一旦为<code>width</code>设定了具体数值，元素的流动性就会消失。</p>
<h2 id="与现实世界表现不一致"><a href="#与现实世界表现不一致" class="headerlink" title="与现实世界表现不一致"></a>与现实世界表现不一致</h2><p>设计网页时，我们希望某个元素的宽度是多少，但是给它设置<code>margin</code>、<code>padding</code>和<code>border</code>属性后，元素的实际宽度就会变大，这与我们想要的不一致。</p>
<p>下面我们介绍如何解决上面的问题。</p>
<h1 id="解决width和padding、margin等属性不能共存问题"><a href="#解决width和padding、margin等属性不能共存问题" class="headerlink" title="解决width和padding、margin等属性不能共存问题"></a>解决width和padding、margin等属性不能共存问题</h1><h2 id="CSS流体布局下的宽度分离原则"><a href="#CSS流体布局下的宽度分离原则" class="headerlink" title="CSS流体布局下的宽度分离原则"></a>CSS流体布局下的宽度分离原则</h2><p><strong>宽度分离原则</strong>，就是CSS中的<code>width</code>属性不与影响宽度的<code>padding</code>/<code>border</code>（有时也包括<code>margin</code>）属性共存。</p>
<p>那么我们同时需要设置<code>width</code>和<code>padding/border/margin</code>属性时该怎么办呢？采用分离原则，<code>width</code>独立占用一层标签，<code>padding</code>、<code>margin</code>、<code>border</code>利用流动性在内部自适应呈现。</p>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.father</span> {</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">180px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.son</span> {</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">1px</span> solid;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure>
<h2 id="改变width作用细节的box-sizing"><a href="#改变width作用细节的box-sizing" class="headerlink" title="改变width作用细节的box-sizing"></a>改变width作用细节的box-sizing</h2><p><code>box-sizing</code>属性可以改变<code>width</code>属性作用在哪一层盒子上，但遗憾的是，全线支持的只有改变到<code>border box</code>上：</p>
<figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.box</span> {<span class="attribute">box-sizing</span>: border-box}</span><br></pre></td></tr></tbody></table></figure>
<p>当遇到需要<code>margin</code>的布局时，<code>box-sizing: border-box</code>也无用。</p>
<p>从上面看，<strong>宽度分离原则十分重要</strong>！</p>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




    


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
    <link itemprop="mainEntityOfPage" href="http://xiaoqingming18.github.io/2023/04/25/SqlServer-%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="鸣蜩十七">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="鸣蜩十七">
      <meta itemprop="description" content="记录我的学习、生活和恋爱日常">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="undefined | 鸣蜩十七">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          <a href="/2023/04/25/SqlServer-%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95/" class="post-title-link" itemprop="url">SqlServer:创建索引</a>
        </h2>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>
      

      <time title="创建时间：2023-04-25 10:19:15 / 修改时间：11:28:57" itemprop="dateCreated datePublished" datetime="2023-04-25T10:19:15+08:00">2023-04-25</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/" itemprop="url" rel="index"><span itemprop="name">数据库原理</span></a>
        </span>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
          <h1 id="索引"><a href="#索引" class="headerlink" title="索引"></a>索引</h1><h2 id="索引的介绍与功能"><a href="#索引的介绍与功能" class="headerlink" title="索引的介绍与功能"></a>索引的介绍与功能</h2><p>当表中有大量记录时，对表按某些条件进行查询时，耗时又耗力，索引的使用极大的方便了对数据量大的表进行查询。</p>
<p>数据库中的<strong>索引</strong>是一种数据结构，它包含有关表中数据的某些列的信息，这些列被称为<strong>索引列</strong>。通过索引列，数据库系统可以快速查找表中的记录，而不必扫描整个表。</p>
<p>具体来说，索引中通常包含以下信息：</p>
<ol>
<li>索引列的值：索引会将表中某一列的值按照一定的规则进行排序和组织，以便快速地查找、过滤和排序数据。</li>
<li>指向数据行的指针：索引中还会包含指向表中实际数据行的指针，以便在查询需要返回数据行时能够快速定位数据行。</li>
<li>索引列的数据类型：索引列的数据类型是创建索引时必须指定的一个参数，它指定了索引如何排序和比较数据。</li>
<li>索引的类型和属性：不同类型的索引具有不同的属性和行为，如B树索引、哈希索引、全文索引等。</li>
<li>索引的名称：索引必须具有唯一的名称，以便在数据库中进行引用、管理和删除。</li>
</ol>
<h2 id="索引的优缺点"><a href="#索引的优缺点" class="headerlink" title="索引的优缺点"></a>索引的优缺点</h2><p>优点：</p>
<ol>
<li>提高查询性能：索引可以加速数据的查找和过滤，使得数据库查询更快、更有效率。</li>
<li>提高数据的唯一性和完整性：索引可以强制某些列的唯一性和完整性，避免重复数据和错误数据的插入。</li>
<li>支持快速排序：索引可以支持数据的快速排序，使得查询结果按照一定规则排序，方便数据的分析和处理。</li>
<li>支持快速数据访问：索引可以提供快速的数据访问，避免全表扫描和大量的磁盘I/O操作。</li>
<li>提高系统的可靠性和扩展性：索引可以提高系统的可靠性和扩展性，使得系统更加稳定和可靠。</li>
</ol>
<p>缺点：</p>
<ol>
<li>占用额外的存储空间：索引需要占用额外的存储空间，因为索引需要存储索引列的值和指向数据行的指针。</li>
<li>降低数据的插入和更新性能：索引会影响数据的插入和更新性能，因为每次插入和更新操作都需要更新索引。</li>
<li>可能导致查询优化问题：索引的不当使用可能会导致查询优化问题，如选择错误的索引、过多的索引和重复索引等。</li>
<li>复杂的应用场景：在某些复杂的应用场景中，索引的设计和使用比较困难，需要对数据结构和查询语句进行深入的分析和优化。</li>
</ol>
<h2 id="索引的类型"><a href="#索引的类型" class="headerlink" title="索引的类型"></a>索引的类型</h2><p>索引有很多类型，这里详细介绍<strong>聚集索引</strong>和<strong>非聚集索引</strong>。</p>
<p><strong>聚集索引</strong>是将数据按照索引列的顺序存储在磁盘上的一种索引类型。在聚集索引中，数据行的物理顺序与索引顺序相同，所以一个表只能有一个聚集索引。</p>
<p><strong>非聚集索引</strong>    是在磁盘上维护一个独立的索引结构，它包含了索引列和指向数据行的指针。非聚集索引可以加速按照索引列的等值查询和范围查询操作，而且在插入和更新数据时不需要重新排序，但是需要额外的存储空间来维护索引结构。</p>
<p>举例说明一下聚集索引和非聚集索引的区别，假设有一个名为“students”的表，包含以下字段：id、name、age、gender、score。</p>
<p>我们可以将“students”表按照“id”字段创建聚集索引。这意味着在磁盘上，数据将按照“id”字段的顺序存储。在这种情况下，id字段是表的主键，因此每个记录的id值都是唯一的。这使得聚集索引非常适合按照id字段进行查询和排序操作，因为数据的物理顺序与索引顺序相同。</p>
<p>我们可以使用非聚集索引来优化“students”表的其他查询操作。例如，我们可以创建一个非聚集索引来加速按照“score”字段进行查询。这将在磁盘上创建一个独立的索引结构，包含score字段的值和指向相应数据行的指针。这个索引可以加速按照score字段的等值查询和范围查询操作。</p>
<p>说简单点，<strong>聚集索引类似查字典的拼音查字，非聚集索引类似于部首查或笔画查字</strong>。</p>
<h1 id="SQL语法"><a href="#SQL语法" class="headerlink" title="SQL语法"></a>SQL语法</h1><h2 id="创建索引"><a href="#创建索引" class="headerlink" title="创建索引"></a>创建索引</h2><p>首先来考虑创建聚集索引还是非聚集索引。如果表已经有主键，则主键将自动成为聚集索引。因此，如果==表已经有主键==，则无需再创建聚集索引，也即创建非聚集索引。</p>
<p>其次另一个概念是<strong>简单索引</strong>与<strong>唯一索引</strong>，唯一索引和普通索引的区别在于索引列是否允许重复值。</p>
<p>创建索引时，首先需要确定表的索引列。如果表没有主键约束，则可以创建聚集索引，但如果有主键约束就只能创建非聚集索引。建立索引的命令格式是：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> [<span class="keyword">UNIQUE</span>] [CLUSTERED <span class="operator">|</span> NONCLUSTERED]</span><br><span class="line">INDEX 索引名</span><br><span class="line"><span class="keyword">ON</span> 表名 <span class="operator">|</span> 视图名 (列 [<span class="keyword">ASC</span><span class="operator">|</span><span class="keyword">DESC</span>][,…n])</span><br></pre></td></tr></tbody></table></figure>
<div class="table-container">
<table>
<thead>
<tr>
<th>关键字</th>
<th>解释</th>
</tr>
</thead>
<tbody>
<tr>
<td>UNIQUE</td>
<td>表示创建的索引具有唯一性</td>
</tr>
<tr>
<td>CLUSTERED</td>
<td>指明创建的索引为聚集索引</td>
</tr>
<tr>
<td>NONCLUSTERED</td>
<td>指明创建的索引为非聚集索引</td>
</tr>
<tr>
<td>ASC、DESC</td>
<td>指定特定的索引列的排序方式为升序(默认)或降序</td>
</tr>
</tbody>
</table>
</div>
<h2 id="删除索引"><a href="#删除索引" class="headerlink" title="删除索引"></a>删除索引</h2><p>删除索引用 DROP 命令实现，格式是：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> INDEX 表名.索引名;</span><br></pre></td></tr></tbody></table></figure>
<h1 id="举例说明"><a href="#举例说明" class="headerlink" title="举例说明"></a>举例说明</h1><p>现有Student表如下：</p>
<p><img src="/2023/04/25/SqlServer-%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95/SqlServer-创建索引\图1.png" alt="Student表"></p>
<h2 id="创建简单索引（允许索引列重复值）"><a href="#创建简单索引（允许索引列重复值）" class="headerlink" title="创建简单索引（允许索引列重复值）"></a>创建简单索引（允许索引列重复值）</h2><p>为 Student 表的<code>Sname</code>字段创建简单索引：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> INDEX sname_ind <span class="keyword">ON</span> Student (Sname)</span><br></pre></td></tr></tbody></table></figure>
<h2 id="创建唯一索引（不允许索引列重复值）"><a href="#创建唯一索引（不允许索引列重复值）" class="headerlink" title="创建唯一索引（不允许索引列重复值）"></a>创建唯一索引（不允许索引列重复值）</h2><p>为 Student 表的<code>Sname</code>字段创建唯一索引：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">UNIQUE</span> INDEX sname_UNI_ind <span class="keyword">ON</span> Student (Sname)</span><br></pre></td></tr></tbody></table></figure>
<p>此时，若向表中插入包含重复姓名的学生数据（尽管其他字段不重复），就会提示无法插入重复值：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> Student <span class="keyword">VALUES</span>(<span class="string">'97007'</span>,<span class="string">'欧阳超'</span>,<span class="string">'fm'</span>,<span class="number">22</span>,<span class="string">'物理系'</span>);</span><br></pre></td></tr></tbody></table></figure>
<p>这里因为学生姓名欧阳超已经存在，所以插入失败。</p>
<h2 id="创建唯一聚集索引"><a href="#创建唯一聚集索引" class="headerlink" title="创建唯一聚集索引"></a>创建唯一聚集索引</h2><p>为 Student 表的<code>Sno</code>字段创建唯一聚集索引：</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">UNIQUE</span> CLUSTERED INDEX sno_cl_ind <span class="keyword">ON</span> Student(Sno);</span><br></pre></td></tr></tbody></table></figure>
<p>==如果表中已经存在了聚集索引，则不能创建多个聚集索引。==这里因为<code>sno</code>字段是主键，默认已经为它创建了一个聚集索引，所以此时再为此表为<code>sno</code>字段创建聚集索引提示无法对表<code>Student</code>创建多个聚集索引。</p>
<h2 id="创建组合索引"><a href="#创建组合索引" class="headerlink" title="创建组合索引"></a>创建组合索引</h2><p>同时指定<code>Sname</code>和<code>Ssex</code>作为索引列。</p>
<figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> INDEX name_sex_ind <span class="keyword">ON</span> student (Sname, Ssex);</span><br></pre></td></tr></tbody></table></figure>
<h2 id="创建视图索引，！！！待学习"><a href="#创建视图索引，！！！待学习" class="headerlink" title="创建视图索引，！！！待学习"></a>创建视图索引，！！！待学习</h2><p>这个很重要，待补充</p>

      
    </div>

    
    
    

    <footer class="post-footer">
        <div class="post-eof"></div>
      
    </footer>
  </article>
</div>




  <nav class="pagination">
    <a class="extend prev" rel="prev" title="上一页" aria-label="上一页" href="/page/2/"><i class="fa fa-angle-left"></i></a><a class="page-number" href="/">1</a><a class="page-number" href="/page/2/">2</a><span class="page-number current">3</span><a class="page-number" href="/page/4/">4</a><a class="extend next" rel="next" title="下一页" aria-label="下一页" href="/page/4/"><i class="fa fa-angle-right"></i></a>
  </nav>

</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">


<div class="copyright">
  &copy; 
  <span itemprop="copyrightYear">2023</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">鸣蜩十七</span>
</div>
  <div class="powered-by">由 <a href="https://hexo.io/" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.js.org/muse/" rel="noopener" target="_blank">NexT.Muse</a> 强力驱动
  </div>

    </div>
  </footer>

  
  <div class="toggle sidebar-toggle" role="button">
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
  </div>
  <div class="sidebar-dimmer"></div>
  <div class="back-to-top" role="button" aria-label="返回顶部">
    <i class="fa fa-arrow-up fa-lg"></i>
    <span>0%</span>
  </div>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
<script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/motion.js"></script><script src="/js/schemes/muse.js"></script><script src="/js/next-boot.js"></script>

  




  




  

  <script class="next-config" data-name="enableMath" type="application/json">true</script><script class="next-config" data-name="mathjax" type="application/json">{"enable":true,"tags":"none","js":{"url":"https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.js","integrity":"sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI="}}</script>
<script src="/js/third-party/math/mathjax.js"></script>



</body>
</html>
